目录
中介者模式(Mediator Pattern)
中介者模式的核心角色:
优缺点
使用场景
注意事项
代码实现
中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)引入一个中介者对象,将一组对象的交互行为封装到一个中介者对象中,从而使这些对象不需要显式地相互引用并直接交互。通过中介者对象,这些对象可以间接地交互,从而降低对象之间的耦合性,使得对象之间的通信更加简单和灵活。
中介者模式的核心角色:
- 中介者(Mediator):定义了各个对象之间通信的接口。
- 具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个对象之间的通信。
- 同事对象(Colleague):定义了各个对象的通信接口。
- 具体同事对象(Concrete Colleague):实现了同事对象接口,负责实际的通信操作。
优缺点
(1)优点:
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
- 符合迪米特原则。
(2)缺点:
- 中介者会庞大,变得复杂难以维护。
使用场景
- 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项
-
不应当在职责混乱的时候使用。
代码实现
package mainimport "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() stringSendMessage(message string)
}// 具体同事对象:用户
type ChatUser struct {name stringmediator 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!")
}