中介者模式通过引入中介者对象解耦多个对象间的复杂交互,使对象无需直接引用彼此。在聊天室示例中,用户通过ChatRoom发送消息,由中介者转发给其他用户,避免了直接依赖。该模式降低耦合、提升可维护性,适用于GUI、游戏、通信系统等多对象协作场景,但需注意中介者自身复杂度控制。

在Go语言开发中,当多个对象之间交互频繁时,容易导致代码高度耦合,维护困难。中介者模式(Mediator Pattern)提供了一种解耦方式:通过引入一个中介者对象来封装一系列对象之间的交互,使对象之间不必直接引用彼此,从而降低系统的复杂度。
中介者模式的核心是将多对多的直接交互变为一对多的关系。原本各个组件相互调用,现在改为组件只与中介者通信,由中介者统一协调行为。
这种设计特别适用于如聊天室、GUI组件联动、游戏对象通信等场景。
假设我们实现一个简单的聊天室,用户(User)之间不能直接发送消息,必须通过聊天室(ChatRoom)转发。这样用户之间就无需知道彼此的存在。
立即学习“go语言免费学习笔记(深入)”;
示例代码:
package main
import "fmt"
// User 用户结构体
type User struct {
name string
chatRoom *ChatRoom
}
func (u *User) Send(message string) {
fmt.Printf("%s 发送消息: %s\n", u.name, message)
u.chatRoom.Notify(u, message)
}
func (u *User) Receive(sender string, message string) {
fmt.Printf("%s 收到 %s 的消息: %s\n", u.name, sender, message)
}
// ChatRoom 聊天室作为中介者
type ChatRoom struct {
users []*User
}
func NewChatRoom() *ChatRoom {
return &ChatRoom{users: make([]*User, 0)}
}
func (cr *ChatRoom) AddUser(user *User) {
user.chatRoom = cr
cr.users = append(cr.users, user)
}
func (cr *ChatRoom) Notify(sender *User, message string) {
for _, user := range cr.users {
if user != sender {
user.Receive(sender.name, message)
}
}
}
func main() {
chatRoom := NewChatRoom()
alice := &User{name: "Alice"}
bob := &User{name: "Bob"}
charlie := &User{name: "Charlie"}
chatRoom.AddUser(alice)
chatRoom.AddUser(bob)
chatRoom.AddUser(charlie)
alice.Send("大家好,我是Alice!")
bob.Send("Hi,我是Bob。")
}
在这个例子中:
使用中介者模式后,系统具备以下优点:
中介者模式适合用于多个对象紧密协作的系统,但也要注意:
基本上就这些。中介者模式在Go中虽不常被提起,但在需要解耦复杂交互时非常实用。关键是把“谁该做什么”理清楚:对象负责自身行为,中介者负责协调关系。
以上就是Golang中介者模式应用 减少对象耦合的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号