中介者模式 -- Mediator

2017-04-11 23:30:51   最后更新: 2017-04-11 23:30:51   访问数量:188




在项目中,对象间的相互调用是非常常见的情况,这也就造成了对象之间的耦合,中介者模式就是用来封装一系列对象间的交互,对象不需要再显式地相互引用,从而使其耦合松散,可以独立的改变他们之间的交互

虽然一个系统拆分成多个对象通常来说可以增加系统的灵活性,但是大量对象相互依赖,错综复杂的关系又让他们成为了不可分割的整体,这就造成了可维护性的下降,也失去了多对象拆分的意义,进行一个较大改动将会变得十分困难,因为每一个行为都分布在多个对象中

例如,对于一个软件安装程序,他拥有是否同意选项、进度条、下一步按钮、文本显示窗口、关闭按钮等控件,这是一个非常简单的程序,但是只有勾选是否同意选项后下一步按钮才变为可点击,下一步按钮点击后才触发进度条前进,同时触发关闭按钮置为不可用,同时文本显示窗口提示相应的提示,当进度条前进到某一位置,文本显示窗口更新新的提示文本

可以看到,一个非常简单的功能却有着如此错综复杂的相互调用行为,可谓是牵一发而动全身,进行任何一点改变都有可能会影响其他的控件

如果我们设计一个窗口组件间的终结者,他负责获取各个组件的状态,并协调他们之间的交互,充当一个组件间通信的中转中心,整个设计就会显得清晰很多,每个控件都不需要关心自己的行为会影响谁,整个流程的运转由这个中介者负责

 

 

 

如上图所示,中介者模式由以下组件构成:

  • Mediator -- 中介者接口,用于定义与各个组件间的通信操作
  • ConcreteMediator -- 具体终结者,用于协调各个同事对象实现写作行为
  • Colleague -- 同事类,系统中需要被中介者协调的组件对象,每一个中介者都保存有一个中介者对象,当需要与其他同事通信的时候,他就与中介者进行通信

 

中介者模式具有以下优点:

  1. 减少了子类的生成,中介者将原本分布于多个对象间的行为集中在一起,改变这些行为只需要创建新的 ConcreteMediator 即可
  2. Colleague 间实现了解耦,因此可以被充分重用或独立改变
  3. 整个系统被简化,更加易于理解、维护和扩展
  4. 抽象了对象之间的协作,由于所有对象间的交互都由中介者对象完成,因此整个交互过程将更加容易理解

 

控制集中化既有他的优点,同时也可能是系统的缺陷,过度集中的控制行为可能让中介者模块变得复杂而难于维护

 

中介者模式有时与 Observer 模式一起使用,将 Mediator 实现为一个 Observer,各个 Colleague 作为 Subject,Subject 有任何状态变化都通知 Mediator,Mediator 做出的响应是将状态改变的结果传播给其他 Colleague

在实际工程中,被广泛应用的消息队列的广播机制也常常用来实现这一模式,消息队列成为一个中介者,各个模块发生状态变化,都进行消息的投递,订阅该消息的模块则可以在收到消息后进行相应的处理

 






读书笔记      技术帖      龙潭书斋      消息队列      面向对象      oop      设计模式      design pattern      行为模式      中介者      中介者模式     


京ICP备15018585号