视窗
loading...
您现在的位置:首页 > IT认证 > JAVA >

Java设计模式的中介者模式


  一、引子

  中介在现实生活中并不陌生,满大街的房屋中介、良莠不齐的出国中介……。它们的存在是因为它们能给我们的生活带来一些便利:租房、买房用不着各个小区里瞎转;出国留学也不用不知所措。

  中介者模式在程序设计中也起到了类似的作用。

  二、定义与结构

  GOF给中介者模式下的定义是:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。

  当然并不是所有的对象都需要加入“中介”对象。如果对象之间的关系原本一目了然,中介对象的加入便是“画蛇添足”。

  来看下中介者模式的组成部分吧。

  1) 抽象中介者(Mediator)角色:抽象中介者角色定义统一的接口用于各同事角色之间的通信。

  2) 具体中介者(Concrete Mediator)角色:具体中介者角色通过协调各同事角色实现协作行为。为此它要知道并引用各个同事角色。

  3) 同事(Colleague)角色:每一个同事角色都知道对应的具体中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作。

  来自《设计模式》一书的类图:

  由于中介者的行为与要使用的数据与具体业务紧密相关,抽象中介者角色提供一个能方便很多对象使用的接口是不太现实的。所以抽象中介者角色往往是不存在的,或者只是一个标示接口。如果有幸能够提炼出真正带有行为的抽象中介者角色,我想同事角色对具体中介者角色的选择也是策略的一种应用。

  “恰到好处,过犹不及”。适合自己系统的便是最好的。

  三、进一步讨论

  是否还记得应用广泛的MVC分为哪三层?模型层(Model)、表现层(View)还有控制层(ControlMediator)。控制层便是位于表现层与模型层之间的中介者。笼统地说MVC也算是中介者模式在框架设计中的一个应用。

  由于中介者模式在定义上比较松散,在结构上和观察者模式、命令模式十分相像;而应用目的又与结构模式“门面模式”有些相似。

  在结构上,中介者模式与观察者模式、命令模式都添加了中间对象――只是中介者去掉了后两者在行为上的方向。因此中介者的应用可以仿照后两者的例子去写。但是观察者模式、命令模式中的观察者、命令都是被客户所知的,具体哪个观察者、命令的应用都是由客户来指定的;而大多中介者角色对于客户程序却是透明的。当然造成这种区别的原因是由于它们要达到的目的不同。

  从目的上看,中介者模式与观察者模式、命令模式便没有了任何关系,倒是与前面讲过的门面模式有些相似。

  但是门面模式是介于客户程序与子系统之间的,而中介者模式是介于子系统与子系统之间的。这也注定了它们有很大的区别:门面模式是将原有的复杂逻辑提取到一个统一的接口,简化客户对逻辑的使用。它是被客户所感知的,而原有的复杂逻辑则被隐藏了起来。而中介者模式的加入并没有改变客户原有的使用习惯,它是隐藏在原有逻辑后面的,使得代码逻辑更加清晰可用。

  前面已经陆陆续续的将中介者模式的特点写了出来。这里再总结一下。使用中介者模式最大的好处就是将同事角色解耦。这带来了一系列的系统结构改善:提高了原有系统的可读性、简化原有系统的通信协议――将原有的多对多变为一对多、提高了代码的可复用性……

  但是中介者角色集中了太多的责任,所有有关的同事对象都要由它来控制。这不由得让我想起了简单工厂模式,但是由于中介者模式的特殊性――与业务逻辑密切相关,不能采用类似工厂方法模式的解决方法。因此建议在使用中介者模式的时候注意控制中介者角色的大小。

  讨论了这么多关于中介者模式的特点。可以总结出中介者模式的使用时机:一组对象以定义良好但是复杂的方式进行通信,产生了混乱的依赖关系,也导致对象难以复用。

  四、总结

  中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

 

 

【免责声明和版权说明】
本站部分信息来源于互联网,对转载的信息我们力求标明信息的出处,我们尊重作者的版权著作权,对我们转载的信息如有异议或有侵权或违法信息请及时联系我们,本站会立即删除,对原创内容我们愿意支付适当的稿酬,联系方式:邮件:webmaster@jscj.com 电话:4008816886
上一条:下面没有链接了
下一条:Java程序员的迷失―论“虚拟机”

相关文章

无相关信息
更新时间2022-09-16 09:56:15【至顶部↑】
联系我们 | 邮件: webmaster@jscj.com | 客服热线电话:4008816886(QQ同号) |  婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈嗙箾绾绡€鐎殿喖顭烽幃銏㈡偘閳ュ厖澹曢梺姹囧灮濞呫儵鎮烽悧鍫熺槑缂傚倸鍊搁崐椋庢媼閺屻儱纾婚柟鐐灱閺€浠嬫煟濡搫绾у璺哄閺岋綁骞橀崘鍙夋闂佺灏欐灙妤楊亙鍗冲畷鐓庘攽閸偅肖濠电姵顔栭崰妤佺仚濠电偛顦扮粙鎺椼€佹繝鍥ㄢ拻濞达絽鎲¢崯鐐寸箾鐠囇呯暤鐎规洝顫夌€靛ジ寮堕幋鐙€鏀ㄩ梻浣筋潐閸庡吋鎱ㄩ妶澶嬪亗闁哄洢鍨洪悡鍐煃鏉炴壆顦﹂柡瀣ㄥ€栫换娑㈠醇閻旂硶鎷归梺闈涙搐鐎氼垳绮诲☉銏℃櫜闁告洦鍨版禒鎰版⒒娴e憡鎯堥柡鍫墰缁瑩骞嬮敃鈧悡婵嬪箹濞n剙鈧鎮块埀顒勬⒑閸濆嫭宸濆┑顖e弮瀹曨垳鈧綆鍠楅埛鎺懨归敐鍛暈闁诡垰鐗撻弻锝夘敇閻戝棙楔缂備浇浜崑鐐电箔閻旂厧鐒垫い鎺戝閸嬫ɑ銇勯弴妤€浜鹃悗瑙勬礀閻栧ジ銆佸Δ浣哥窞閻庯綆鍋呴悵銊╂⒒閸屾瑧顦﹂柟娴嬪墲缁楃喎螖閸涱厾鐛ュ┑掳鍊曢幊蹇涘磿婵犲啰绡€濠电姴鍊绘晶娑㈡煃闁垮绗掗棁澶愭煥濠靛棙鍣洪柛銈呯墢閹叉悂鎮ч崼婵呭垔闂佽桨绀佺€氫即寮诲☉銏犵労闁告劦浜栧Σ鍫㈢磽娴e搫校闁绘搫绻濆璇测槈閵忕姈銊︺亜閺冨倸甯舵い顐邯濮婅櫣绮欏▎鎯у壉闁藉啴浜堕弻鏇㈠炊瑜嶉顓犫偓娈垮枟濞兼瑨鐏冮梺閫炲苯澧紒鍌氱У閵堬綁宕橀埡浣插亾閻㈠憡鍋℃繛鍡楃箰椤忣亞绱掗埀顒勫焵椤掑倻纾介柛灞炬皑瀛濋梺鎸庢处娴滎亝淇婄€涙ɑ濯寸紒顖涙礃閻庡姊虹憴鍕姢缁剧虎鍙冮幃锟犲箣閿旇В鎷洪梻鍌氱墛閸愯崵妲愰敓鐘崇厱闁哄洨鍋涢。宕囩棯椤撴稑浜惧┑鐘垫暩婵兘寮崨濠冨弿闁绘垼妫勯弸渚€鏌涘☉姗堟敾闁告瑥绻橀弻锝夊箣閿濆棭妫勯梺鍝勵儎缁舵岸寮诲☉妯锋婵鐗婇弫楣冩⒑閸涘﹦鎳冪紒缁樺灴婵$敻宕熼姘鳖啋闂佸憡顨堥崑鐔哥閼测晝纾奸柣鎰靛墮閸斻倖銇勯鐘插幋鐎殿喖顭烽幃銏ゆ偂鎼达綆妲堕柣鐔哥矊缁绘帡寮灏栨闁靛骏绱曢崢浠嬫⒑鐟欏嫬鍔ら柣掳鍔庣划鍫⑩偓锝庡枟閻撴盯鎮橀悙闈涗壕缂佲偓閸愵亖鍋撻崹顐g凡閻庢凹鍣i崺鈧い鎺戯功缁夐潧霉濠婂懎浠︾紒鍌涘浮楠炴﹢顢欑憴锝嗗闂備胶枪缁绘劙宕ョ€n喖桅闁绘柨鍚嬮悡鏇㈡煏婵炲灝鈧洖鐣甸崱娑欑厱闁崇懓鐏濋悘鍙夘殽閻愮柕顏嗗弲缂傚倷鐒﹁摫婵炲懎娲缁樼瑹閳ь剙岣胯閹广垽宕卞☉妯兼煣濠电姴锕ら幊澶愬磻閹剧粯顥堟繛鎴炴皑閸旑垰鈹戦纭锋敾婵$偠妫勮灋闁告劑鍔夊Σ鍫熸叏濮楀棗澧婚柡鍡╁亝缁绘繄鍠婂Ο娲绘綉闂佺ǹ顑呴幊姗€骞冮悜钘夌厸闁告洦鍓ㄧ槐鎾绘⒒閸屾瑨鍏岀痪顓炵埣瀹曟粌鈹戞繝鍌滅☉婵犵數鍋涢悺銊у垝瀹ュ洤鍨濋柟鎹愵嚙閽冪喖鏌ㄩ悢鍝勑㈢痪鎯у悑閹便劌顫滈崱妤€顫┑鐐茬墕缂嶅﹤顫忓ú顏勫窛濠电姴鍟犻幏濠氭⒑閸濄儱校闁绘濮撮锝嗙節濮橆厼浜滈梺鍏肩ゴ閺呮稓绮婇敃鍌涒拺闁告捁灏欓崢娑㈡煕閻樺磭顣查悗闈涖偢瀹曞ジ濡烽敂瑙勫闂佸搫顦遍崑鐐寸珶閸℃稑绀夌€广儱顦伴悡娆撴煟閻斿搫顣奸柛鐘翅缚閳ь剚顔栭崳顕€宕戞繝鍥╁祦婵☆垵鍋愮壕鍏间繆椤栨粎甯涙い蹇曞枛濮婄粯鎷呴懞銉с€婇梺闈╃秶缁犳捇鐛箛娑欐櫢闁跨噦鎷�

付款方式留言簿投诉中心网站纠错二维码手机版

电话:
付款方式   |   给我留言   |   我要纠错   |   联系我们