设计模式之中介者模式
意图:
中介者模式也属于行为模式的一种,它的意图是使用一个中介对象来封装一系列的对象交互。中介者使得对象不需要显示的相互引用,从而使其耦合松散,而且可以独立改变它们之间的交互。
动机:
面向对象的设计鼓励将行为分布到各个对象中去,这种分布可能导致对象间有许多的连接,在最坏的情况下,每一个对象都知道其他所有对象。
虽然将一个系统分解为许多个对象可以增强其复用性,但对象间相互连接的激增又会降低其复用性。大量相互连接使得对象似乎不太可能在没有其他对象支持下工作-系统表现为一个不可分割的整体。而且对系统进行任何形式的改变都会变得非常困难,因为许多行为被分配在不同对象中。结果是不得不定制很多子类以定制系统的行为。
例子:
就拿最贴近我们生活的OEM手机做个例子,市场上有个花生公司,专门生产花生手机,已经有了1代,2代现在正准备生成3代和4代。我们知道手机是由很多个部件组成的,有屏幕,电板,CPU生成厂家等等。花生公司前两部手机都是自己设计和生产的,后来他们发现,花费了这么多功夫自己设计手机,非常耗时,而且成本也居高不下,最主要的是,当完成1代生产进入二代生产的时候,发现自己原有的磨具,屏幕,电板卧槽都用不了了,或者说需要重新进行设计和组合。
花生公司发现这样弄不行啊,公司最擅长的不是做产品啊,是炒货啊,这样大投入太影响主页了,于是它们想了个办法,将花生3代,花生4代交由代工厂去做,公司只要下命令说给我生产花生手机3代就行了,不用理会下面复杂的设计和生产工序,实际上降低了生产成本。
在这里,花生公司就可以看做是业务的驱动者,在中介者模式中是Colleague class(同事类),而OEM公司则是中介者;复杂的部件生产厂家就是互相协作的类,也是我们想简化的目标。
适用性:
一组对象以定义良好但复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
(在具体的软件生产中,当业务逻辑复杂到无法维护的情况下,通常会有人提出说将其进行重构和优化,最简单的就是抽象出中介类,对功能进行更高层次的抽象,我们都在使用,但是不知道叫中介者而已)
一个对象引用其他很多对象并直接与这些对象通信,导致难以复用
(复杂的类通常是难以重用的,为什么对象关心别人胜过关心自己呢)
想定制一个分布于多个类的行为,而又不想生成太多的子类
结构:
解释:
Mediator, 中介者,定义一个借口用户和同事通信
ConcreteMediator,具体中介者,协调各个同事对象实现协作行为;了解并维护他的同事对象
Colleague class,每个同事类都知道中介者对象的存在,同事间相互通信的时候都需要通过中介者转发
协作:
同事向一个中介者对象发送和接收请求。中介者在同事间适当的转发请求以实现协作行为
效果:
减少了子类生成,将各个colleague解耦,简化了对象协议,对对象如何协作进行了抽象,使得控制集中化
相关模式:
与Facde模式不同的地方在于他对一个对象子系统进行抽象,从而提供了一个更为方便的接口。协议是单向的,即Facade对子系统类提供请求,反之不同。相反,中介者提供了colleague不能支持的行为,且其协议是多向的。