Pandora中的设计模式之Mediator模式

什么是Mediator模式?

中介者模式的定义为

  • Define an object that encapsulates how a set of objects interact. (用一个中介对象封装一系列对象的交互。)
  • Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.(中介者使得个对象不需要显式的相互作用,从而使其松散耦合,而且独立地改变他们之间的交互。)

Mediator模式是较为广泛使用的一种模式,它的优点就是把原有的1对多的依赖变成1对1的依赖,减少了依赖,降低了耦合,比如在一个逻辑中,同时需要调用到几个类,这时就可以将这几个类放入到一个中介类中,只依赖这一个中介类。这就减少了类之间的依赖,缺点就在于中介类是几个类的集合,这多少有些显得有些冗余。如果在类设计时出现了网状的类图,这个时候就需要考虑使用Mediator模式减少类与类之间的依赖。

Mediator的UML图如下:

clipboard.png

Mediator:Colleage对象交互接口。

ConcreteMediator: 实现合作行为,协调Colleage对象,维护Colleage之间的联系。

Colleage:Colleage对象应该知道中介类,并且需要通过中介类与其他的Colleage对象进行交互。

列举一个简单的例子,写字板上的字体控件,通常是由两个下拉列表组成,更改字体样式跟更改字体大小,样式跟大小的改变都会导致Notepad文本的样式发生变化,我们分析这样的一个场景,会有Notepad类,Notepad类中包含FontListBox类,SizeListBox类还有保存内容的Content类,这个Content类会根据FontListBox、SizeListBox的选择来改变内容,这个就需要Notepad类知道所有的其他类,通常时序会像这样,Notepad调用FontListBox改变Font样式,然后Notepad调用Content改变样式,再调用SizeListBox改变大小,再调用Content改变样式。

这个示例中,逻辑还算清晰,不会有FontListBox与Notepad Content这样的交互,Meidator模式最适用于解决类与类之间网状交互的情形,可以用Mediator模式把环状的模式改变成星状的交互,使得所有的类只依赖Mediator类与其他类进行交互,复杂的逻辑也在mediator类中实现。

下面我们应用用mediator模式后,更改设计如下:


clipboard.png

其中, aFontDialogDirector是mediator的作用,Notepad只与Director类产生关系,在调用玩setFont()与setSize()后,会回调到onFontChanged()这个函数,Notepad中只需要继承anEntryField,响应onFontChanged事件,调用aFontDialogDirector去改变字体就行了,不用再去了解FontDialog内部的逻辑了。

改进后的时序

clipboard.png

了解了这么多,下面是Mediator模式在Pandora中的应用。

在Pandora中,Mediator模式的应用随处可见,基本上所有Pandora中可操作的对象都封装成mediator的调用,像ArtworkMediator,GuideMediator,MarkMediator,PressSheetMediator,StepRepeatMediator,以GuideMediator为例,其设计类图如下。

clipboard.png

GuideMover相当于一个Client,是调用者的身份,GuideMediator处理所有的GuideGlyph(显示),与GuideConstraint(拖拽吸附) 的逻辑,在UpdatePosition时,GuideGlyph重绘,与Constraint值重新计算,很好的隔离了GuideMover这个类与GuideGlyph与GuideConstraint。

虽然使用Mediator模式会产生代码的冗余,但是却带来了代码更清晰的好处,权衡利弊,在合适的地方使用Mediator模式。

中介者模式的实际应用:

MVC框架:MVC框架中的C(Controller)其实就是一个中介者,作用就是把M和V隔离开,协调M和V的工作,这也是中介者优点的一个体现。
源码附件:
https://pan.baidu.com/s/13uOI7RHsNjbCxX4AA4_atA

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

推荐阅读更多精彩内容