Mediator(中介者模式)

介绍

一个大型电子公司想请你开发一款软件,用于操作他们最新的全自动洗衣机。该公司提供给你它的硬件规范以及该机器的功能。在规范中,他们提供了不同的洗衣程序。他们想要提供完全自动的不需要人介入的清洗过程。用户只需要将水管与机器连接,放入衣物,指定衣物的类型如棉,丝或纤维等,然后按开始键就好了。

机器应该足够聪明,当需要水的时候,就把水冲入洗衣机的滚筒里面。它应该能够根据衣物的类型,开启加热器来提供适合清洗的温度。它应给能根据衣物尽快的启动马达,转动滚筒,然后冲洗衣物,如果需要的话,它还能使用去污剂和软化剂。

作为一个面向对象的开发者,你开始分析和归类对象,类以及它们的关系。让我们检查该系统中某些重要的类和部件。首先,一个_Machine_类,具有一个滚筒。因此,就有一个_Drum_类,同样也就有_Heater_,Sensor_和一个_Motor_类。此外,机器应该有一个_Valve_控制水的流量,以及_SoilRemovalDetergentsoftener

这些类相互之间有非常复杂的关系,而且关系也是变化的。请注意当前我们讨论的是机器的高级抽象。如果我们设计时,不考虑面向对象的原则和模式,那么最初的设计将会是紧耦合的,难以维护的。这是因为以上的类需要相互交互才能完成工作。比如,_Mathine_应该通知_Valve_来打开阀门,Motor_根据清洗程序的设置以特定的转速转动_Drum(轮毂)。某些类型的衣服需要软化剂或去污剂而其它的不需要,以及针对不同的衣物,要设置不同的温度等。

如果我们让类直接交互,也就是说,提供一个引用,那么设计就会紧紧的耦合在一起,而且难以维护。将会难以改变一个类的同时不影响其它类。更糟糕的是,根据不同的清洗程序,类之间的关系是会改变的,就像不同类型的衣物,需要不同的温度。因此,这些类是难以重用的。更更糟糕的是,为了支持所有的清洗程序,我们需要将控制语句如if-else放在代码中,而这将让代码更加复杂和难以维护。

为了将这些对象各自解耦,我们需要一个中介者,让它来与各个对象交互,以此来提供松散的耦合。各个对象只需要知道中介者,然后让中介者执行相应的操作就好了。中介者会根据需要执行各种操作,来完成工作。

中介者模式是最适合这个情况的了,解决这个问题之前,我们来了解下中介者模式。

什么是中介者模式

中介者模式——定义封装了一系列对象交互逻辑的一个对象。中介者通过让对象之间隐式的引用,降低了耦合,使得你可以独立的改变他们的交互逻辑。

对象之间不直接交互,对象让中介者代表自己来交互,以此提高重用性和松耦合。它将对象间的交互封装,使它们相互对立。这样,当需要改变对象之间的交互逻辑时,只需要再提供一个新的中介者就好。中介者较少了类的复杂度。每个对象不在需要知道与其它对象该怎样交互。对象见的耦合度从紧密脆弱变得松散又强壮。

在使用中介者模式前,类之间的交互可能是这样的(甚至c1,c4/c2,c3直接也交互):

现在,在我们应用了中介者模式之后,类之间的交互应该是这样的,各个类只包含一个中介者引用:

当有一系列对象紧密耦合在一起的时候,中介者模式应该是你的第一选择。让我们看看中介者模式的正式结构:

如上图,那些保持着对中介者类引用的类叫做同僚,也就是同僚之间合作完成工作。中介者模式的主要成员如下:

  • Mediator:定义与_Colleague_通信的接口
  • ConcreteMediator:_Colleague_对象之间具体的交互逻辑,它维护者一组_Colleague_和它们之间的交互逻辑
  • Colleague:每一个_Colleague_类都知道它自身的_Mediator_对象。每一个_Colleague_要与其它_Colleague_通信时,都是与自己的_Mediator_通信
posted @ 2017-01-31 00:29  JintaoXIAO  阅读(277)  评论(0编辑  收藏  举报