首页 > 其他分享 >Go 设计模式中中介者模式

Go 设计模式中中介者模式

时间:2023-11-10 11:35:39浏览次数:31  
标签:Mediator 对象 中介 SendMessage 模式 Go message 设计模式


鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

Go 设计模式中中介者模式_中介者

 

中介者模式原理详细解释:
中介者模式(Mediator Pattern)是一种行为型设计模式,用于降低多个对象之间的直接通信,并使其通过一个中介者对象进行交互。

中介者模式的核心思想是将多个对象之间的复杂交互逻辑集中在一个中介者对象中,从而使各个对象之间的耦合度降低。中介者对象充当了对象间的调度者和协调者,负责处理对象之间的通信和交互。

中介者模式通常包含以下几个角色:

  • 中介者(Mediator):定义对象间的通信接口,并负责协调各个对象之间的交互。
  • 具体中介者(Concrete Mediator):实现中介者接口,具体处理对象间的通信和交互逻辑。
  • 同事类(Colleague):定义对象间通信的接口,维护一个对中介者对象的引用。
  • 具体同事类(Concrete Colleague):实现同事类接口,通过中介者对象与其他同事类进行通信。

底层结构图:
以下是中介者模式的经典结构图:

+-----------------+        +-----------------+
|    Mediator        |        |    Colleague       |
+-----------------+        +-----------------+
| +SendMessage() |<>------| +ReceiveMessage() |
+-----------------+        +-----------------+
        ▲
        |
        |
+-----------------+
| ConcreteMediator |
+-----------------+
| +colleague1         |
| +colleague2         |
| +colleague3         |
| +...                     |
+-----------------+

在上述结构图中,Mediator 是中介者的角色,定义了对象间的通信接口。它通常包含一个或多个方法,如 SendMessage(),用于发送消息给其他同事类。

Colleague 是同事类的角色,定义了对象间通信的接口。它维护一个对中介者对象的引用,并通过调用中介者的方法来进行通信。

ConcreteMediator 是具体中介者的角色,实现了中介者接口,并具体处理对象间的通信和交互逻辑。它包含对各个同事类的引用,并根据需要调用各个同事类的方法。

使用场景解释:
中介者模式适用于以下场景:

  1. 当多个对象之间存在复杂的交互逻辑,导致对象之间的耦合度较高时,可以考虑使用中介者模式。中介者模式可以将复杂的交互逻辑集中在中介者对象中,使得各个对象之间的通信变得简单,并且减少了对象之间的直接依赖关系。
  2. 当需要通过一个中介者对象来协调和调度多个对象之间的交互时,可以使用中介者模式。中介者模式可以将对象间的通信集中管理,提供更好的可维护性和扩展性。
  3. 当希望通过增加或修改中介者对象来改变对象间的交互方式时,可以考虑使用中介者模式。中介者模式将对象间的交互逻辑封装在中介者对象中,因此可以通过修改中介者对象来改变对象间的交互方式,而无需修改各个同事类。

代码示例实现:
以下是一个使用Go语言实现中介者模式的示例:

package main

import "fmt"

// Mediator 中介者
type Mediator interface {
	SendMessage(colleague Colleague, message string)
}

// Colleague 同事类
type Colleague interface {
	ReceiveMessage(message string)
}

// ConcreteMediator 具体中介者
type ConcreteMediator struct {
	colleague1 Colleague
	colleague2 Colleague
}

func (m *ConcreteMediator) SendMessage(colleague Colleague, message string) {
	if colleague == m.colleague1 {
		m.colleague2.ReceiveMessage(message)
	} else if colleague == m.colleague2 {
		m.colleague1.ReceiveMessage(message)
	}
}

// ConcreteColleague1 具体同事类1
type ConcreteColleague1 struct {
	mediator Mediator
}

func (c *ConcreteColleague1) ReceiveMessage(message string) {
	fmt.Println("ConcreteColleague1 received:", message)
}

func (c *ConcreteColleague1) SendMessage(message string) {
	c.mediator.SendMessage(c, message)
}

// ConcreteColleague2 具体同事类2
type ConcreteColleague2 struct {
	mediator Mediator
}

func (c *ConcreteColleague2) ReceiveMessage(message string) {
	fmt.Println("ConcreteColleague2 received:", message)
}

func (c *ConcreteColleague2) SendMessage(message string) {
	c.mediator.SendMessage(c, message)
}

func main() {
	mediator := &ConcreteMediator{}

	colleague1 := &ConcreteColleague1{
		mediator: mediator,
	}

	colleague2 := &ConcreteColleague2{
		mediator: mediator,
	}

	mediator.colleague1 = colleague1
	mediator.colleague2 = colleague2

	colleague1.SendMessage("Hello from ConcreteColleague1")
	colleague2.SendMessage("Hello from ConcreteColleague2")
}

在上述示例中,我们定义了 Mediator 接口和 Colleague 接口,分别表示中介者和同事类的角色。然后,我们实现了具体的中介者 ConcreteMediator 和两个具体的同事类 ConcreteColleague1 和 ConcreteColleague2

在 ConcreteMediator 中,我们通过 SendMessage 方法来实现同事类之间的通信。在 ConcreteColleague1 和 ConcreteColleague2 中,我们分别实现了 ReceiveMessage 和 SendMessage 方法来接收和发送消息。

最后,在 main 函数中,我们创建了中介者对象和两个同事类对象,并将它们互相关联起来。然后,通过调用同事类的 SendMessage 方法来发送消息。

文献材料链接:
以下是一些关于中介者模式的文献和参考资料链接:

  1. Design Patterns: Elements of Reusable Object-Oriented Software (GoF Book) - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
    (《设计模式:可复用面向对象软件的基础》 - Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)
  2. Mediator Pattern - SourceMaking
    (中介者模式 - SourceMaking)
    Mediator Design Pattern
  3. Mediator Design Pattern in Go - Tutorialspoint
    (Go 中的中介者设计模式 - Tutorialspoint)
    Design Patterns - Mediator Pattern | Tutorialspoint

当前都有哪些产品在使用:
中介者模式是一种常见的设计模式,在软件开发中被广泛应用。许多产品和框架在其内部或公开的API中使用了中介者模式来处理对象间的通信和交互。

以下是一些常见的产品和框架,它们可能使用了中介者模式或类似的设计模式:

  1. GUI框架(如Java Swing、JavaFX、Qt等):这些框架通常使用中介者模式来协调界面组件之间的交互,例如按钮点击、菜单选择等。
  2. 消息中间件(如Apache Kafka、RabbitMQ等):这些消息中间件使用中介者模式来处理发布-订阅模型中的消息传递和交互。
  3. 聊天应用程序(如微信、Slack等):这些应用程序使用中介者模式来处理用户之间的聊天消息传递和交互。
  4. 游戏引擎(如Unity、Unreal Engine等

标签:Mediator,对象,中介,SendMessage,模式,Go,message,设计模式
From: https://blog.51cto.com/chenfenglove/8294034

相关文章

  • Go 设计模式中观察者模式
    鱼弦:内容合伙人、新星导师、全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)          观察者模式原理详细解释:观察者模式(ObserverPattern)是一种行为型设计模式,它定义了......
  • Golang锁简单使用
    golang主要有两种锁:互斥锁和读写锁互斥锁Mutex用于提供一种加锁机制(LockingMechanism),保证同一时刻只有一个goroutine在临界区运行packagemainimport( "fmt" "sync" "time")funcmain(){ varmutexsync.Mutex x:=0 gofunc(){ mutex.Lock() x=x+1......
  • Golang服务端断线重连
    断线重连的逻辑很简单,就是把用户存到服务器内存中,当客户端再次登录的时候,判断内存中是否有用户的值,有的话替换packagemainimport( "fmt" "github.com/gorilla/websocket" "log" "net/http" "sync" "time")typeClientstruct{ conn*we......
  • 记录使用mongotemplete关于时间查询时的大坑
    1、问题:在使用条件查询mongdb数据库的时候,涉及到使用时间范围来查询数据,比如当时使用的是:1990-01-01T00:00:00到1900-02-02T00:00:00查询的是1月1号到1月2号两天的数据,但是在使用Query.query(criteria);进行查询的时候,和使用Aggregation.match(criteria);进行查询得出的结果不......
  • Go 面向接口编程
    接口有什么用?就是存储未实现的方法,作为实现的此方法的结构体的实例的句柄。typeSayerinterface{ say()}typeDogstruct{}typeCatstruct{}func(*Dog)say(){ fmt.Println("Woewwoew")}func(*Cat)say(){ fmt.Println("Meowmeow")}funcmain(){ va......
  • D - Good Tuple Problem atcoder abc 327
    D-GoodTupleProblemhttps://atcoder.jp/contests/abc327/tasks/abc327_d 思路https://www.zhihu.com/question/292465499判断二分图的常见方法是染色法:用两种颜色,对所有顶点逐个染色,且相邻顶点染不同的颜色如果发现相邻顶点染了同一种颜色,就认为此图不为二分图当所......
  • mongodb如何设置用户名和密码
    1.创建用户//连接到MongoDB数据库mongo//切换到admin数据库useadmin1.1创建root用户db.createUser({  user:"admin",  pwd:"admin123",  roles:[    {role:"userAdminAnyDatabase",db:"admin"},    {role:"dbAdminAnyDatab......
  • 解锁设计模式的神秘面纱:编写无懈可击的代码之单例设计模式
    前言单例设计模式是23种设计模式中最常用的设计模式之一,无论是三方类库还是日常开发几乎都有单例设计模式的影子。单例设计模式提供了一种在多线程情况下保证实例唯一性的解决方案。单例设计模式虽然简单,但是实现方案却非常多,大体上有以下7种最常见的方式。饿汉模式所谓饿汉式,就是......
  • 【django框架】共4大模块50页md学习文档 第5篇:django的请求与响应详解
    当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源PythonWeb框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用整套Django笔记直接地址:请移步这里共10章,31子模块请求与响应学习目标掌握r......
  • 【Django-DRF笔记】使用md笔记0基础到高手. 第(5)篇:Django-DRF序列化和反序列化
    本文从分析现在流行的前后端分离Web应用模式说起,然后介绍如何设计RESTAPI,通过使用Django来实现一个RESTAPI为例,明确后端开发RESTAPI要做的最核心工作,然后介绍DjangoRESTframework能帮助我们简化开发RESTAPI的工作。DRF完整版笔记直接地址:请移步这里共5章,24子模块,总计......