首页 > 创新 >

焦点信息:Go设计模式–中介者,最后的模式!

2023-05-26 17:03:57 来源:清一色财经

中介者模式(Mediator Pattern)又叫作调解者模式或调停者模式。 用一个中介对象封装一系列对象交互, 中介者使各对象不需要显式地相互作用, 从而使其耦合松散, 而且可以独立地改变它们之间的交互, 属于行为型设计模式。


(资料图片)

大家好,这里是每周都在陪你一起进步的网管~!今天继续学习设计模式,也是我们要学习的最后一个设计模式—中介者模式,对这个模式有一点了解后会觉得它跟我们已经学过的观察者模式挺像,但是两者还是有些区别的,使用场景也不一样,具体我们放在最后再讲,先来一起学习中介者模式。

中介者模式是一种行为设计模式, 能让程序减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行交互。

中介者模式使修改、扩展和重用单个组件变得容易,因为它们不再依赖于所有其他类。下面我们举一个简单的例子来说明怎么在程序里使用中介者模式减少各个组件类之间的耦合。

在现实生活中,机场的控制塔是一个典型的中介者角色, 飞机在起飞和降落前都会向控制塔发出问询,控制塔会给飞机发送指令协调它们的起飞降落时间,避免造成事故。

现在假设一个机场只有一条跑道,即同一时刻只能承载一架飞机的起飞和降落,飞机和飞机之间不能直接沟通,这样就乱套了,必须由控制塔作为一个中介者向各个飞机(组件)同步跑道的可用状态。

下面我们先来定义飞机和指挥塔–即组件和中介者的 Interface 接口。

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"// 中介者--机场指挥塔的接口定义type mediator interface { canLanding(airplane airplane) bool notifyAboutDeparture()}// 组件--飞行器的接口定义type airplane interface { landing() takeOff() permitLanding()}

接下来我们来实现具体的组件,这里提供两个组件作为演示,一架波音飞机和一架空客飞机。

每个飞机在降落landing方法里都会去跟作为中介者的指挥塔发出问询,看是否能够降落,如果跑道正在被占用,那么会等待指挥塔调用它自己的permitLanding()通知可以降落后再降落。而其他占用跑道的飞机在起飞后会通过中介者提供的notifyAboutDeparture()告知指挥塔自己的离去。

具体的代码如下:

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"// 组件1--波音飞机type boeingPlane struct { mediator}func (b *boeingPlane) landing() { if !b.mediator.canLanding(b) {  fmt.Println("Airplane Boeing: 飞机跑到正在被占用,无法降落!")  return } fmt.Println("Airplane Boeing: 已成功降落!")}func (b *boeingPlane)takeOff() { fmt.Println("Airplane Boeing: 正在起飞离开跑道!") b.mediator.notifyAboutDeparture()}func (b *boeingPlane)permitLanding() { fmt.Println("Airplane Boeing: 收到指挥塔信号,允许降落,正在降落!") b.landing()}// 组件2--空客飞机type airBusPlane struct { mediator mediator}func (airbus *airBusPlane) landing() { if !airbus.mediator.canLanding(airbus) {  fmt.Println("Airplane AirBus: 飞机跑到正在被占用,无法降落!")  return } fmt.Println("Airplane AirBus: 已成功降落!")}func (airbus *airBusPlane) takeOff() { fmt.Println("Airplane AirBus: 正在起飞离开跑道!") airbus.mediator.notifyAboutDeparture()}func (airbus *airBusPlane)permitLanding() { fmt.Println("Airplane AirBus: 收到指挥塔信号,允许降落,正在降落!") airbus.landing()}

作为中介者的指挥塔,提供两个方法

canLanding:提供给飞机组件问询是否可以降落的方法,如果不可以会把飞机加入到等待队列中,后续跑道空闲后会进行通知。notifyAboutDeparture:提供给占用跑道的飞机通知指挥塔已起飞,指挥塔会向排队降落的飞机中的首位发送降落指令–调用飞机对象的permitLanding方法
"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"// 中介者实现--指挥塔type manageTower struct { isRunwayFree bool airportQueue []airplane}func (tower *manageTower) canLanding(airplane airplane) bool { if tower.isRunwayFree {  // 跑道空闲,允许降落,同时把状态变为繁忙  tower.isRunwayFree = false  return true } // 跑道繁忙,把飞机加入等待通知的队列 tower.airportQueue = append(tower.airportQueue, airplane) return false}func (tower *manageTower) notifyAboutDeparture() { if !tower.isRunwayFree {  tower.isRunwayFree = true } if len(tower.airportQueue) > 0 {  firstPlaneInWaitingQueue := tower.airportQueue[0]  tower.airportQueue = tower.airportQueue[1:]  firstPlaneInWaitingQueue.permitLanding() }}func newManageTower() *manageTower { return &manageTower{  isRunwayFree: true, }}

这样我们就可以通过指挥塔,协调多个飞机使用飞机场跑道进行有序的起飞和降落了。

"本文使用的完整可运行源码去公众号「网管叨bi叨」发送【设计模式】即可领取"func main() { tower := newManageTower() boeing := &boeingPlane{  mediator: tower, } airbus := &airBusPlane{  mediator: tower, } boeing.landing() airbus.landing() boeing.takeOff()}

执行程序后,会有类似下面的输出:

本文的完整源码,已经同步收录到我整理的电子教程里啦,可向我的公众号「网管叨bi叨」发送关键字【设计模式】领取。

看完例子对中介者模式有了一定了解后我们接下来再详细说说它的构成以及用代码实现中介者模式的步骤。

中介者模式的构成

中介者模式的结构构成可以用下面的UML类图来表示

图中的各个类的构成跟我们上面代码实例中列举的十分类似,Component 实现类里需要持有指向中介者的引用,中介者里也保有对各个组件对象的引用,只不过示例里是把组件保存在一个列表里,UML 中是把各个组件单独保存在了中介者的属性里。

下面我们再把用代码实现中介者模式的步骤简单叙述一遍:

定义一组会相互调用,拥有强耦合的组件。指定中介者接口以及中介者与各个组件之间的通信方式。在大多数情况下中介者接口中必须有一个Notify/Notification方法从组件接收通知。创建具体中介者实现,该实现将会存储其管理的所有Component对象的引用组件对象应该保存中介者的引用,如果想在不同上下文下使用不同的中介者实现,那么应该通过中介者接口类型保存对具体中介者的引用。将组件对象调用其他组件对象的方法提炼到中介者中,组件对象调用中介者的通知方法,由中介者再去调用相对应的组件的方法,从而完成组件与组件间的解耦。

中介模式与观察者模式区别

中介模式与观察者模式在结构上有些相似,观察者模式中的EventDispatcher 和 中介模式中的 Mediator 看起来很想,都是把多个组件之间的关系,维护到自身,实现组件间的间接通信达到解构效果,不过这两个设计模式在使用场景或者叫要解决的问题上,还是有些差别

观察者模式

组件间的沟通是单向的,从被观察(发送事件的实体)到观察者(监听器),一个参与者要么是观察者要么是被观察者,不会同时兼具两种身份。

中介模式

参与者之间可以双向沟通,当参与者之间关系复杂维护成本很高的时候可以考虑中介模式。

总结

中介者模式(Mediator Pattern)又叫作调解者模式或调停者模式。 用一个中介对象封装一系列对象交互, 中介者使各对象不需要显式地相互作用, 从而使其耦合松散, 而且可以独立地改变它们之间的交互, 属于行为型设计模式。

中介者模式主要适用于以下应用场景。

系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。交互的公共行为,如果需要改变行为,则可以增加新的中介者类。

中介者模式的优点

减少类间依赖,将多对多依赖转化成一对多,降低了类间耦合。类间各司其职,符合迪米特法则。

中介者模式的缺点

中介者模式将原本多个对象直接的相互依赖变成了中介者和多个组件类的依赖关系。当组件类越多时,中介者就会越臃肿,变得复杂且难以维护。

最后

今天这篇完结后,用Go学设计模式就正式更新完了,算是一个小小的成就,大家可以在专辑链接里查看系列里的其他文章,后面会写篇总结把设计模式的学习心法给大家说一说,其实就是多看,多练,除此之外也有点小技巧,咱们放到后面给系列收尾时再说。

上一篇:

走进中国唯一的驯鹿部落-当前看点

下一篇:

最后一页

x
推荐阅读

焦点信息:Go设计模式–中介者,最后的模式!

新资讯:诺贝尔发明了什么_发明了哪些物品

走进中国唯一的驯鹿部落-当前看点

今日快讯:麻衣神相txt下载完整版_麻衣神相txt下载

环球最新:让爱充满全地mp3_让爱充满全地

盐源县气象台发布大风蓝色预警信号【IV级/一般】【2023-05-26】

《后浪》杨天真为什么要租房?

雨季到菌香飘 昆明这条美食街迎来“尝鲜”食客_天天播资讯

当前短讯!中药板块持续走高 多股午后涨停

玉溪美食有哪些_玉溪美食有什么-最新资讯

反击!中国在南沙三岛礁布设灯浮标 中国实控南沙岛礁-全球热闻

世界最资讯丨我国风电光伏发电总装机突破8亿千瓦

全球最新:黑膏药的制作方法及配方_黑膏药的制作方法

记者调查|遂昌背街小巷"划线"了?弄堂停车该如何规范

河源:龙川佗城获4A级景区牌匾

环球热推荐:小山村也能有大作为

环球今热点:宁海路6号民国建筑

百家融媒重庆行丨“两江四岸”起风景 百家融媒记者乘船游江直呼“好舒服”

5月26日生意社TDI基准价为17300.00元/吨-天天短讯

天天速读:5月25日基金净值:南方中证房地产ETF最新净值0.6085,跌0.21%

银河证券:国内版号持续稳定发放 AI助力游戏厂商降本提效 时快讯

新开发银行行长、巴西前总统罗塞芙:脱钩是经济全球化主要威胁 速递

微动态丨人民法律出版社(法律基础 2013年广东旅游出版社出版的图书)

江铃重汽暂停生产销售 发布时间 : 2023-05-26 浏览量 : 13

日本长野县袭击事件致4人死亡 嫌疑人已被捕|世界热头条

标致1.8t发动机什么型号_标致1.8t发动机是原装进口吗

长城汽车举报比亚迪旗下车型排放不达标 天天热资讯

【全球速看料】AI首次通过广告图灵测试

每日报道:碧落黄泉之陨落星辰

泥娃娃面膜干了揭不掉(泥娃娃面膜撕拉还是洗)_全球时快讯

OpenAI CEO:在重压下会考虑退出欧洲市场

海天国际(01882.HK):5月25日南向资金增持9.9万股-天天精选

摩托罗拉Razr 40 Ultra完整规格与渲染泄露

杭州装修论坛_关于杭州装修论坛概略-最新资讯

环球微速讯:北京平谷挂牌1宗预申请用地 交易起始价4.9亿元

每天车闻:长城举报比亚迪旗下车型涉嫌排放不达标-天天快看

传媒行业5月25日资金流向日报 世界热闻

每日热议!“两高”:特殊职责人员利用优势地位迫使未成年发生性关系 构成强奸罪

5月25日华泰保兴吉年福净值下跌0.27% 天天新视野

江西九江金久再生资源有限公司发生一起窒息事故,致3人死亡

四时田园杂兴其一其二共同特点_四时田园杂兴其一其二

全球快资讯丨天奴官网_天奴

武斗酷猫怎么超进化武斗灵猫_武斗酷猫怎么超进化_世界观速讯

环球今亮点!天坑鹰猎结局(天坑鹰猎结局什么意思)

今头条!葡萄高产优质栽培与气象(关于葡萄高产优质栽培与气象的简介)

红薯和苹果能一起煮粥吗?-天天热头条

信用卡最低还款利息怎么算的?信用卡逾期如何防止扣储蓄卡? 世界微速讯

多领域前沿技术汇聚!大湾区成先进制造技术产业化首选地|大湾区科学论坛

全球报道:韩国自研“世界”号运载火箭发射升空

全球快消息!我科学家研发出柔性单晶硅太阳能电池