设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成。当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点)。而当对象的数量增加时,这种直接交互会导致对象之间复杂的、混乱的引用,最后形成一张巨大的网,这就会影响应用程序的可维护性。同时,因为对象之间的高耦合,当一个对象直接引用其他的对象时,缩小了这些对象的复用范围。
    因此:我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
   以上的变化反映在下图:

   
   中介者模式的相关角色如下图:



  由图可知,它的角色有:
 1、抽象同伴类角色 ColleagueBase。它是"具体同伴类角色"的基类,同时在它内部要引用到一个抽象中介类成员。
 2、抽象中介类角色 MediatorBase。它是"具体中介类角色"的基类. 它定义了要求其子类必须完成的方法,此方法可以被具体同伴类角色调用。
 3、具体同伴类角色 ConcreteColleague A/B. 它们都继承自"抽象同伴类角色 ColleagueBase",由具体同伴类角色所产生的实例化对象不再像以前那样相互之间直接联系,而是通过"具体中介类角色"进行统一协调和管理。在上图中所定义的Send和 Receive方法表示此类具有发送和接收信息的功能,但这时的发送和接收通讯是在ConcreteColleague 与Mediator之间进行,而不是在ConcreteColleague之间直接通讯,因为通过Mediator,它们与自己的同伴之间早就解除了耦合。
 4、具体中介类角色ConcreteMediator. 它实现了抽象中介类角色所定义的通讯功能(此图中是Sendmessage功能)。但此功能是由具体同伴类角色实例ConcreteColleague来调用的,因为在具体中介类角色实例中保存了所有参与活动的具体同伴类角色实例的引用,它们在Mediator中介角色里集中放置与管理。当我们调用相关通讯功能时,通过中介者角色的管理,由它来决定信息通讯的目的地。
下面我们用代码来加以说明

我们有两段程序,一个用于演示中介者模式工作的基本流程,另一个我们使用中介者模式来模拟一个聊天室。
一、基本流程示例代码
1、抽象同伴类角色 AbsPeople

Code

2、抽象中介类角色 AbsMediator

Code

3、具体同伴类角色 Student与Teacher

Code

4、具体中介类角色 RealMediator

Code

5、客户应用

Code

二、中介者模式实现的聊天室

1、抽象同伴类角色  AbsParticipant 
Code

2、抽象中介类角色 AbsChatRoom

Code

3、具体同伴类角色  Boy与Girl

Code

4、具体中介类角色  RealChatRoom

Code

5、客户应用 

Code

程序如下图:

                  

运行效果如下:
                  

适用性:

    1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
    3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。

前往:设计模式学习笔记清单
posted @ 2009-10-09 19:58  wsdj  阅读(902)  评论(1编辑  收藏  举报