研磨设计形式 之 中介者模式(Mediator)1 ——跟着cc学设计系列

研磨设计模式 之 中介者模式(Mediator)1 ——跟着cc学设计系列

10.1  场景问题

10.1.1  如果没有主板

大家都知道,电脑里面各个配件之间的交互,主要是通过主板来完成的(事实上主板有很多的功能,这里不去讨论)。试想一下,如果电脑里面没有主板,会怎样呢?

如果电脑里面没有了主板,那么各个配件之间就必须自行相互交互,以互相传送数据,理论上说,基本上各个配件相互之间都存在交互数据的可能。如图10.1所示:

 研磨设计形式 之 中介者模式(Mediator)1 ——跟着cc学设计系列

图10.1  没有主板,各个配件相互交互示意图

这也太复杂了吧,这还没完呢,由于各个配件的接口不同,那么相互之间交互的时候,还必须把数据接口进行转换才能匹配上,那就更恐怖了。

所幸是有了主板,各个配件的交互完全通过主板来完成,每个配件都只需要和主板交互,而主板知道如何和所有的配件打交道,那就简单多了,这就避免了如图10.1所描述的那样乱作一团,有主板后的结构如图10.2所示:

 研磨设计形式 之 中介者模式(Mediator)1 ——跟着cc学设计系列

图10.2  有主板后的结构示意图

10.1.2  有何问题

如果上面的情况发生在软件开发上呢?

如果把每个电脑配件都抽象成为一个类或者是子系统,那就相当于出现了多个类之间相互交互,而且交互还很繁琐,导致每个类都必须知道所有需要交互的类,也就是我们常说的类和类耦合了,是不是很麻烦?

在软件开发中出现这种情况可就不妙了,不但开发的时候每个类会复杂,因为要兼顾其它的类,更要命的是每个类在发生改动的时候,需要通知所有相关的类一起修改,因为接口或者是功能发生了变动,使用它的地方都得变,快要疯了吧!

那该如何来简化这种多个对象之间的交互呢?

10.1.3  使用电脑来看电影

       为了演示,考虑一个稍微具体点的功能。在日常生活中,我们经常使用电脑来看电影,把这个过程描述出来,这里仅仅考虑正常的情况,也就是有主板的情况,简化后假定会有如下的交互过程:

  • 首先是光驱要读取光盘上的数据,然后告诉主板,它的状态改变了
  • 主板去得到光驱的数据,把这些数据交给CPU进行分析处理
  • CPU处理完后,把数据分成了视频数据和音频数据,通知主板,它处理完了
  • 主板去得到CPU处理过后的数据,分别把数据交给显卡和声卡,去显示出视频和发出声音

当然这是一个持续的、不断重复的过程,从而形成不间断的视频和声音,具体的运行过程不在讨论之列,假设就有如上简单的交互关系就可以了。也就是说想看电影,把光盘放入光驱,光驱开始读盘,就可以看电影了。

现在要求使用程序把这个过程描述出来,该如何具体实现呢?