AIGC标识 中介者模式(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. 关键点复盘

  1. 从网状到星形:引入中介者后,User 不需要持有其他 User 的引用,新增或删除用户只需改动 ChatRoom
  2. 同事对象只依赖中介者:这是中介者模式降低耦合的关键。每个 User 只调用 room.Broadcast,不关心消息最终发给谁。
  3. 中介者的职责边界:中介者负责“转发”,不负责“业务处理”。如果中介者开始处理具体业务逻辑,就会演变成上帝对象。
  4. 与观察者模式的区别:观察者是一对多通知,被观察者通常不知道观察者具体是谁;中介者则是一对一转发,由中介者维护所有同事的列表并决定路由。
  5. 与发布订阅模式的区别:发布订阅通过消息队列/主题解耦,发布者和订阅者完全不知道对方;中介者模式下同事对象至少知道中介者的存在。
posted @ 2026-08-10 10:37  FfHUCisI  阅读(5)  评论(0)    收藏  举报