GO设计模式——19、中介者模式(行为型)

目录

中介者模式(Mediator Pattern)

中介者模式的核心角色:

优缺点

使用场景

注意事项

代码实现


中介者模式(Mediator Pattern)

        中介者模式(Mediator Pattern)引入一个中介者对象,将一组对象的交互行为封装到一个中介者对象中,从而使这些对象不需要显式地相互引用并直接交互。通过中介者对象,这些对象可以间接地交互,从而降低对象之间的耦合性,使得对象之间的通信更加简单和灵活。

中介者模式核心角色

  • 中介者(Mediator):定义了各个对象之间通信的接口。
  • 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个对象之间的通信。
  • 同事对象(Colleague):定义了各个对象的通信接口。
  • 具体同事对象(Concrete Colleague):实现了同事对象接口,负责实际的通信操作。

优缺点

(1)优点:

  • 降低了类的复杂度,将一对多转化成了一对一。
  • 各个类之间的解耦。
  • 符合迪米特原则。

(2)缺点:

  • 中介者会庞大,变得复杂难以维护。

使用场景

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项

  • 不应当在职责混乱的时候使用。

代码实现

package main

import "fmt"

// 聊天室应用程序,其中有多个用户可以发送消息给其他用户。希望能够实现用户之间的通信,而不需要直接依赖其他用户的对象。

// 中介者接口
type Mediator interface {
    SendMessage(message string, user User)
}

// 具体中介者:聊天室
type ChatRoom struct{}

func (cr *ChatRoom) SendMessage(message string, user User) {
    fmt.Printf("%s 发送消息:%s\n", user.GetName(), message)
}

// 同事对象接口
type User interface {
    GetName() string
    SendMessage(message string)
}

// 具体同事对象:用户
type ChatUser struct {
    name     string
    mediator Mediator
}

func NewChatUser(name string, mediator Mediator) *ChatUser {
    return &ChatUser{
       name:     name,
       mediator: mediator,
    }
}

func (cu *ChatUser) GetName() string {
    return cu.name
}

func (cu *ChatUser) SendMessage(message string) {
    cu.mediator.SendMessage(message, cu)
}

// 客户端代码
func main() {
    chatRoom := &ChatRoom{}

    user1 := NewChatUser("User1", chatRoom)
    user2 := NewChatUser("User2", chatRoom)
    user3 := NewChatUser("User3", chatRoom)

    user1.SendMessage("Hello, User2!")
    user2.SendMessage("Hi, User1!")
    user3.SendMessage("Nice to meet you all!")
}

相关推荐

  1. GO设计模式——19中介模式行为

    2023-12-23 02:50:03       74 阅读
  2. 行为设计模式中介模式

    2023-12-23 02:50:03       57 阅读
  3. 设计模式行为设计模式——中介模式

    2023-12-23 02:50:03       44 阅读
  4. 设计模式行为模式中介模式

    2023-12-23 02:50:03       46 阅读
  5. 设计模式(十二):中介模式行为模式

    2023-12-23 02:50:03       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-23 02:50:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-23 02:50:03       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-23 02:50:03       82 阅读
  4. Python语言-面向对象

    2023-12-23 02:50:03       91 阅读

热门阅读

  1. Centos 7.6 gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)

    2023-12-23 02:50:03       54 阅读
  2. TypeScript 常见配置项

    2023-12-23 02:50:03       70 阅读
  3. python异常之try/else分句

    2023-12-23 02:50:03       57 阅读
  4. EASYEXCEL导出表格(有标题、单元格合并)

    2023-12-23 02:50:03       53 阅读
  5. 信息学奥赛一本通 2068:【例2.6】鸡兔同笼

    2023-12-23 02:50:03       70 阅读
  6. 详解Qt的底层实现机制

    2023-12-23 02:50:03       53 阅读
  7. Pandas实践_分类数据

    2023-12-23 02:50:03       43 阅读
  8. 基于NSGA2算法求解多目标优化问题的Matlab代码

    2023-12-23 02:50:03       60 阅读