中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)
1. 知识点总结
中介者模式是一种行为型设计模式,核心思想是:
引入一个中介对象来封装多个对象之间的交互,使对象之间不再直接相互引用,从而降低系统的耦合度。
没有中介者时,多个对象之间的通信会形成“网状结构”:每个对象都要知道其他所有对象。引入中介者后,通信变成“星形结构”:每个对象只依赖中介者,由中介者统一转发消息。
适用场景
- 多个对象之间的交互关系复杂,形成网状依赖;
- 希望把通信逻辑集中管理,便于统一修改和扩展;
- 典型例子:聊天室、飞机塔台、部门协作系统、消息总线。
优缺点
| 优点 | 缺点 |
|---|---|
| 显著降低对象之间的耦合 | 中介者可能变成“上帝对象”,逻辑越来越臃肿 |
| 通信逻辑集中,便于维护 | 系统中对象越多,中介者越复杂 |
| 新增同事对象时只需修改中介者 | 过度使用会让简单系统变得 unnecessary 复杂 |
2. 示例代码
下面用聊天室来演示:用户之间不直接发消息,而是通过聊天室(中介者)转发。
package main
import "fmt"
// ChatRoom 是中介者,负责在用户之间转发消息。
type ChatRoom struct {
users []*User
}
func (c *ChatRoom) Register(u *User) {
u.room = c
c.users = append(c.users, u)
}
func (c *ChatRoom) Broadcast(sender *User, content string) {
for _, u := range c.users {
if u != sender {
u.Receive(sender.name, content)
}
}
}
// User 是同事对象,只依赖 ChatRoom,不需要知道其他用户的引用。
type User struct {
name string
room *ChatRoom
}
func NewUser(name string) *User {
return &User{name: name}
}
func (u *User) Send(content string) {
fmt.Printf("[%s] 发送: %s\n", u.name, content)
u.room.Broadcast(u, content)
}
func (u *User) Receive(from, content string) {
fmt.Printf("[%s] 收到 %s 的消息: %s\n", u.name, from, content)
}
func main() {
room := &ChatRoom{}
alice := NewUser("Alice")
bob := NewUser("Bob")
charlie := NewUser("Charlie")
room.Register(alice)
room.Register(bob)
room.Register(charlie)
alice.Send("大家下午好!")
bob.Send("下午好 Alice!")
}
3. 运行结果
[Alice] 发送: 大家下午好!
[Bob] 收到 Alice 的消息: 大家下午好!
[Charlie] 收到 Alice 的消息: 大家下午好!
[Bob] 发送: 下午好 Alice!
[Alice] 收到 Bob 的消息: 下午好 Alice!
[Charlie] 收到 Bob 的消息: 下午好 Alice!
4. 关键点复盘
- 从网状到星形:引入中介者后,
User不需要持有其他User的引用,新增或删除用户只需改动ChatRoom。 - 同事对象只依赖中介者:这是中介者模式降低耦合的关键。每个
User只调用room.Broadcast,不关心消息最终发给谁。 - 中介者的职责边界:中介者负责“转发”,不负责“业务处理”。如果中介者开始处理具体业务逻辑,就会演变成上帝对象。
- 与观察者模式的区别:观察者是一对多通知,被观察者通常不知道观察者具体是谁;中介者则是一对一转发,由中介者维护所有同事的列表并决定路由。
- 与发布订阅模式的区别:发布订阅通过消息队列/主题解耦,发布者和订阅者完全不知道对方;中介者模式下同事对象至少知道中介者的存在。

浙公网安备 33010602011771号