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

发布时间:2023年12月22日

目录

中介者模式(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!")
}
文章来源:https://blog.csdn.net/Gloming__zxy/article/details/135132965
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。