设计模式之中介者Mediator——没有任何框架不用这个模式

中介模式的中文翻译非常形象。大家买房子要中介,中介做的什么事情呢?我们先不会回答这个问题。而是反问依据,如果没有中介,我们买房子的场景会是怎样?
1. 满世界找有可能买房子的房东?可能同时要跟20个房东打交道,跟房东约时间可真是看天气、看运气的事情
2. 房产交易要签合同?我们要跟房东拟定合同?还要一起房地产交易中心做网签备案
3. 如果全款购房的话,还稍微简单点。如果钱不够想分期怎么办?购房者还要跟银行打交道,可能还不止一家银行,因为各家银行的放款条件,贷款额度、贷款利率和贷款期限可能有所不同

其实上面所说的还可能只是其中一角,这也是为什么绝大部分人都选择中介来帮忙购房或中介来托管房屋,进行售房。有了中介,世界就变得如此简单,比如对于购房者而言,只要关注:
1. 告诉中介我要买房,告之购房要求、可用时间,然后等着看房就好了
2. 房子看重了,要贷款,去中介那里,带上身份证,签个合同就结束了

当然,对于售房者而言,也是一样的简单。因为中介为我们屏蔽了购房过程中的所有角色:购房者 * 售房者 * 银行 * 房地产交易中心,每个角色关注自己的诉求和需要做的事情即可。

这就是中介者模式的魅力。还有很多这样的例子可以拿来说说,比如:
1. 机场的航站塔台对飞机的调度,飞机之间不需要互相通信
2. 一个页面上的复杂表单可能有几十个组件:TextInput、Checkbox、Button、Select、Radio,通常他们是不需要关注彼此的,只要将变更告知整个表单组件以及接受表单组件的通知即可

解决问题&适用场景:

从上面的例子,我们能够看到,中介模式很实用在有多个角色之间,交互复杂且混乱的场景下使用。中介模式能够把网状的交互,编程星形的交互。


代码结构&示例

结构其实比较简单,几个关键的类:
Component:需要进行解耦的对象,上图各个Component最好继承自一个基类,这样会便于中介类做一些抽象和统一管控;每个Component都持有中介对象的引用,有事情发生时,调用notify就好,参数就是Component对象自己就好
Meditator:中介,一般来讲中介类只有一个notify方法就足够了。中介对象持有所有Component的引用,他会收到各个Component对象发来的通知(notify),他知道该怎么协调,下一步该做什么。某种角度,它就是“上帝”,至于说怎么让上帝不至于变得过于复杂,是另外一个需要讨论的命题
ConcreteMediator:具体的中介实现,不同的背景和目的下,实现也会有所不同,比如上面的表单例子中,不同的表单,需要调度的组件、校验、联动规则、提交后的去向等,都会有所不同

代码上我们就以上面的星形图来做示例:
Component


Mediator



Client



输出:
doAlarm()
doCoffeePot()
doCalender()
doSprinkler()

优缺点

Good
1. 遵守单一职责原则,各个组件的职责都可以保持克制和单一
2. 遵守开闭原则,各个组件的代码不需要修改,但是他们的行为的可以通过实现中介类来做扩展
3. 遵守迪米特法则,各个组件之间无需知晓对方的知识,只需要关注和中介的基础交互即可

Bad
组件的可扩展、可维护,是将复杂度转移到中介对象上为代价,因此如果不加控制和设计,中介对象很容已成为一个“上帝对象”,啥都要管,谁都不敢改动

结语

中介模式其实是一个很流行的模式,从它遵守的几个原则就窥见一斑。在该模式下,组件的扩展和维护变得简单,但需要注意的是,要有一个真正的专家(我说的就是个人)来做中介的设计和统筹,并且为了这个专家的知识成为黑洞,甚至公司的负资产,一定要做好文档的记录和backup的培养,要不专家一走,就马上成为一坨可怕的屎山了🤮


————————————————
版权声明:本文为CSDN博主「请给我一根烟的时间」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mytream/article/details/125213653

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容