0

0

Golang如何实现中介者模式解耦对象交互_Golang 中介者模式应用实践

P粉602998670

P粉602998670

发布时间:2025-11-24 21:56:02

|

909人浏览过

|

来源于php中文网

原创

中介者模式通过引入中介者对象集中管理组件交互,实现解耦。在Golang聊天室示例中,用户通过ChatServer发送消息,避免直接引用其他用户,降低耦合,提升可维护性。1. 中介者(ChatMediator)定义通信接口;2. 具体中介者(ChatServer)管理用户并转发消息;3. 同事类(User)通过中介者收发消息,不直接通信。该模式适用于聊天系统、UI联动等场景,但需防中介者过度膨胀。

golang如何实现中介者模式解耦对象交互_golang 中介者模式应用实践

在复杂系统中,多个对象之间直接通信会导致高度耦合,难以维护和扩展。Golang 中通过中介者模式(Mediator Pattern)可以有效解耦对象间的交互逻辑。该模式的核心思想是引入一个“中介者”对象,集中处理对象之间的通信,让各个组件不再相互引用,而是通过中介者进行消息传递。

中介者模式的基本结构

中介者模式包含以下几个关键角色:

  • Mediator(中介者):定义统一接口,用于各组件之间的通信协调。
  • ConcreteMediator(具体中介者):实现中介者接口,管理多个组件实例,并协调它们的交互。
  • Colleague(同事类 / 组件):每个组件持有对中介者的引用,不直接与其他组件通信,而是通过中介者发送和接收消息。

这种结构特别适用于如聊天室、UI组件联动、游戏对象交互等场景。

用 Golang 实现一个聊天室示例

假设我们正在构建一个简单的多人聊天室,用户(User)不能直接向其他用户发送消息,必须通过聊天服务器(ChatServer)中转。这就是典型的中介者应用场景。

立即学习go语言免费学习笔记(深入)”;

package main

// Mediator interface
type ChatMediator interface {
    SendMessage(message string, user User)
}

// ConcreteMediator
type ChatServer struct {
    users []User
}

func (c *ChatServer) AddUser(user User) {
    c.users = append(c.users, user)
}

func (c *ChatServer) SendMessage(message string, sender User) {
    for _, user := range c.users {
        // 不向发送者自己转发消息
        if user.GetName() != sender.GetName() {
            user.Receive(message)
        }
    }
}

// Colleague interface
type User interface {
    GetName() string
    Send(message string)
    Receive(message string)
}

// Concrete colleague
type ChatUser struct {
    name     string
    mediator ChatMediator
}

func NewChatUser(name string, mediator ChatMediator) *ChatUser {
    return &ChatUser{
        name:     name,
        mediator: mediator,
    }
}

func (u *ChatUser) GetName() string {
    return u.name
}

func (u *ChatUser) Send(message string) {
    println(u.name + " 发送消息: " + message)
    u.mediator.SendMessage(message, u)
}

func (u *ChatUser) Receive(message string) {
    println(u.name + " 收到消息: " + message)
}

// 示例使用
func main() {
    server := &ChatServer{}

    alice := NewChatUser("Alice", server)
    bob := NewChatUser("Bob", server)
    charlie := NewChatUser("Charlie", server)

    server.AddUser(alice)
    server.AddUser(bob)
    server.AddUser(charlie)

    alice.Send("大家好,我是 Alice!")
    bob.Send("Hi,我是 Bob。")
}

运行结果会显示每个用户发送的消息被其他用户接收,但用户之间没有直接依赖。所有通信都由 ChatServer 统一调度。

Type Studio
Type Studio

一个视频编辑器,提供自动转录、自动生成字幕、视频翻译等功能

下载

中介者模式的优势与适用场景

使用中介者模式后,系统具备更高的灵活性和可维护性:

  • 组件之间无需知道彼此存在,降低耦合度。
  • 新增用户或修改通信规则只需调整中介者,不影响已有组件。
  • 便于测试,可以单独测试某个 User 或 Mock Mediator。

常见适用场景包括:

  • 多玩家在线游戏中的事件广播系统。
  • GUI 界面中按钮、输入框、下拉菜单之间的联动控制。
  • 微服务架构中服务注册与消息路由中心的简化模拟。

注意事项与潜在问题

虽然中介者模式能解耦,但也可能带来新的问题:

  • 中介者本身容易变得庞大复杂,变成“上帝对象”,需注意职责划分。
  • 过度使用可能导致通信流程不透明,调试困难。
  • 同步处理消息可能影响性能,必要时可结合异步通道(channel)优化。

在 Golang 中,可以通过 goroutine + channel 进一步增强中介者的并发处理能力。例如,将消息投递放入 goroutine 异步执行,避免阻塞发送方。

基本上就这些。中介者模式不是万能钥匙,但在需要集中控制交互逻辑的场景下,它能让代码更清晰、更易扩展。Golang 的简洁语法和接口设计让这种模式实现起来非常自然。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

338

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

391

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

191

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

9

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.8万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号