首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

设计模式-中介者模式(Mediator)

2012-09-11 
设计模式--中介者模式(Mediator) 本文是设计模式学习笔记的第三篇文章,主要分析的是中介者模式。是清华大学

设计模式--中介者模式(Mediator)

 本文是设计模式学习笔记的第三篇文章,主要分析的是中介者模式。是清华大学出版社的《研读设计模式》的读书笔记。在此感谢原作者。



这次应用的是一个实例去理解中介者模式


先来看这样一个实例,电脑播放电影。


我们需要一个DVD,然后放入播放器中,播放器获得数据传递给CPU处理在将数据传给显卡和声卡,循环这个流程。简单么?

实际上,如果没有主板,各部件要自行交互的话是非常复杂的,而且各个配件的接口不同,还要进行转化才能匹配,这是多么烦躁的事情。

所以,我们的电脑上会有主板,每个配件只需要做自己的本职工作就好,做好的东西给主板,需要的东西从主板拿。主板就是一个中介者。


在软件开发上,其实就是解耦。如果每个类都需要和其他类进行交互,那么当一个类发生改变的时候,其他类也要改变,我们可不希望这样。


让我们看看应用中介者模式模拟的电脑播放电影的过程。体验下中介者所干的事情。



先准备好CD,在工程下建立一个a.txt文件,内容如下:

READY?GO!,碾碎他们
~\(≧▽≦)/~,啦啦啦德玛西亚
~\(≧▽≦)/~~\(≧▽≦)/~,啦啦啦啦德玛西亚
~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~,德玛德玛德玛西亚
  ╭︿︿︿╮     ,{/ o  o /}
 ( (oo) )  , ︶ ︶︶    
>>>>FIRST BLOOD<<<<,FIRST BLOOD


首先是CD类:

public class Client {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub//创造主板MotherBoard mediator = new MotherBoard();//创建各部件CD cd = new CD("a.txt");CDDriver cdDriver = new CDDriver(mediator);CPU cpu = new CPU(mediator);VideoCard videoCard = new VideoCard(mediator);SoundCard soundCard = new SoundCard(mediator);//组装各部件到主板上mediator.setCdDriver(cdDriver);mediator.setCpu(cpu);mediator.setVideoCard(videoCard);mediator.setSoundCard(soundCard);//将CD放入播放器中cdDriver.readCD(cd);}




输出结果(为了模仿的更像,加入了线程睡眠,有了延迟输出的效果,所有建议将程序跑起来看下):


视频流:READY?GO!
音频流:碾碎他们
视频流:~\(≧▽≦)/~
音频流:啦啦啦德玛西亚
视频流:~\(≧▽≦)/~~\(≧▽≦)/~
音频流:啦啦啦啦德玛西亚
视频流:~\(≧▽≦)/~~\(≧▽≦)/~~\(≧▽≦)/~
音频流:德玛德玛德玛西亚
视频流:  ╭︿︿︿╮     
音频流:    {/ o  o /}
视频流:     ( (oo) )  
音频流:     ︶ ︶︶    
视频流:>>>>FIRST BLOOD<<<<
音频流:FIRST BLOOD






中介者的本质

中介者的本质是封装交互。中介者的目的,就是用来封装多个对象的交互,这些交互的处理多在中介者对象里面实现。因此中介对象的复杂程度,取决于他封装的交互的复杂程度。


何时选用中介者模式

建议在以下情况时选用中介者模式。

★  如果一组对象之间的通信方式比较复杂,导致相互依赖、结构混乱。可以采用中介者模式,把这些对象的交互管理起来,各个对象都只需要和中介者交互,从而使得各个对象松散耦合,结构也更清晰易懂。

★ 如果一个对象引用很多的对象,并直接跟这些对些对象交互,导致难以复用该对象,可以采用中介者模式,把这个对象跟其他对象的交互封装到中介者对象里边,这个对象只需要和中介者对象交互就好了。


中介者模式的不足

中介者模式的一个潜在缺点是,过度集中化。如果同事对象的交互非常多,而且比较复杂,当这些复杂性全部集中到中介者的时候,会导致中介者对象变得十分复杂,难于管理和维护。


广义中介者

在应用开发中,经常会简化中介者模式,来使开发变得简单,比如:

★通常会去掉同事对象的父类,这样可以让任意的对象,只需要相互交互,就可以成为同事。

★通常不定义Mediator接口,把具体的中介者对象实现为单例。

★同事对象不再持有中介者,而是在需要的时候直接获取中介者对象并调用,对应的,中介者也不再持有对象同事,而是在具体的处理方法里去创建,或者读取。





热点排行