中介者模式通过引入中介者封装对象间通信,实现解耦。在Go中,用接口定义中介者与同事角色,同事间不直接交互,而是通过中介者转发消息,如聊天室示例中用户发送消息由ChatRoom转发给其他用户;在电商系统中,订单、库存、通知等模块通过事件中介者协调,订单模块触发事件,库存与通知模块注册处理器响应,无需直接依赖。优点是降低耦合、提升可维护性与扩展性,新增模块只需注册到中介者;但需注意中介者职责不宜过重,避免臃肿,且不适用于简单通信场景。

在Go语言中,当多个模块之间交互复杂、互相依赖时,使用中介者模式能有效降低耦合度。它通过引入一个“中介者”来封装对象之间的通信逻辑,让原本直接调用的模块转为与中介者交互,从而实现解耦。
中介者模式(Mediator Pattern)是一种行为设计模式,它用来减少多个对象或组件之间的直接依赖。它把对象之间的交互集中到一个中介者对象中处理,对象不再彼此通信,而是通过中介者转发消息。
这种模式特别适合用于模块间关系错综复杂的系统,比如聊天室、GUI组件交互、微服务协调等场景。
在Go中,我们通常用接口定义中介者和同事(Colleague)的行为,通过依赖注入的方式将同事注册到中介者中。
立即学习“go语言免费学习笔记(深入)”;
示例:聊天室中的用户通信假设有多个用户(User),他们不直接发送消息给彼此,而是通过一个聊天室(ChatRoom)作为中介者来转发消息。
1. 定义中介者接口和具体实现:
type Mediator interface {
SendMessage(message string, sender User)
}
type ChatRoom struct {
users []User
}
func (c *ChatRoom) AddUser(user User) {
c.users = append(c.users, user)
}
func (c *ChatRoom) SendMessage(message string, sender User) {
for _, user := range c.users {
if user != sender {
user.Receive(message)
}
}
}
2. 定义同事角色(User):
type User struct {
name string
chatRoom Mediator
}
func NewUser(name string, room Mediator) *User {
return &User{name: name, chatRoom: room}
}
func (u *User) Send(message string) {
u.chatRoom.SendMessage(message, *u)
}
func (u *User) Receive(message string) {
println(u.name + " 收到消息: " + message)
}
3. 使用示例:
MixPHP 是一个 PHP 命令行模式开发框架;基于 Vega 驱动的 HTTP 可以同时支持 Swoole、WorkerMan、FPM、CLI-Server 生态,并且可以无缝切换;V3 是一个高度解耦的版本,整体代码基于多个独立的模块构建,即便用户不使用我们的脚手架,也可以使用这些独立模块,并且全部模块都支持原生开发。例如:你可以只使用 mix/vega 来搭配 laravel orm 使用
12
room := &ChatRoom{}
alice := NewUser("Alice", room)
bob := NewUser("Bob", room)
room.AddUser(*alice)
room.AddUser(*bob)
alice.Send("Hello, Bob!") // Bob 收到消息: Hello, Bob!
在实际项目中,模块可能包括订单、库存、通知、日志等。如果订单模块直接调用库存和通知模块,就会形成强依赖。
使用中介者后,订单模块只需通知中介者“订单已创建”,由中介者决定触发哪些后续动作。
举例:电商系统中的事件中介者
type EventMediator struct {
orderHandlers []func(orderID string)
stockHandlers []func(orderID string)
notifyHandlers []func(orderID string)
}
func (e *EventMediator) OnOrderCreated(orderID string) {
for _, h := range e.stockHandlers {
h(orderID)
}
for _, h := range e.notifyHandlers {
h(orderID)
}
}
func (e *EventMediator) RegisterStockHandler(h func(string)) {
e.stockHandlers = append(e.stockHandlers, h)
}
func (e *EventMediator) RegisterNotifyHandler(h func(string)) {
e.notifyHandlers = append(e.notifyHandlers, h)
}
订单服务只需调用 mediator.OnOrderCreated(orderID),无需知道谁响应这个事件。
库存和通知模块在初始化时注册自己的处理器,完全解耦。
优点:
注意事项:
基本上就这些。中介者模式在Go中通过接口和组合很容易实现,关键是把“谁该做什么”和“谁来协调”分开。只要控制好中介者的职责范围,就能有效解耦复杂系统。
以上就是Golang如何使用中介者模式解耦模块的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号