1、我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成。当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点)。而当对象的数量增加时,这种直接交互会导致对象之间复杂的、混乱的引用,最后形成一张巨大的网,这就会影响应用程序的可维护性。同时,因为对象之间的高耦合,当一个对象直接引用其他的对象时,缩小了这些对象的复用范围。因此:我们可使用一个 “中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。以上的变化反映在下图:中介者模式的相关角色如下图:由图可知,它的角色有:1、抽象同伴类角色 ColleagueBase。它是“ 具体同伴类角
2、色“的基类,同时在它内部要引用到一个抽象中介类成员。2、抽象中介类角色 MediatorBase。它是“具体中介类角色“的基类. 它定义了要求其子类必须完成的方法,此方法可以被具体同伴类角色调用。3、具体同伴类角色 ConcreteColleague A/B. 它们都继承自“抽象同伴类角色 ColleagueBase“,由具体同伴类角色所产生的实例化对象不再像以前那样相互之间直接联系,而是通过“具体中介类角色“ 进行统一协调和管理。在上图中所定义的 Send 和 Receive 方法表示此类具有发送和接收信息的功能,但这时的发送和接收通讯是在 ConcreteColleague 与Mediat
3、or 之间进行,而不是在 ConcreteColleague 之间直接通讯,因为通过 Mediator,它们与自己的同伴之间早就解除了耦合。4、具体中介类角色 ConcreteMediator. 它实现了抽象中介类角色所定义的通讯功能( 此图中是 Sendmessage 功能)。但此功能是由具体同伴类角色实例 ConcreteColleague 来调用的,因为在具体中介类角色实例中保存了所有参与活动的具体同伴类角色实例的引用,它们在Mediator 中介角色里集中放置与管理。当我们调用相关通讯功能时,通过中介者角色的管理,由它来决定信息通讯的目的地。下面我们用代码来加以说明我们有两段程序,一个
4、用于演示中介者模式工作的基本流程,另一个我们使用中介者模式来模拟一个聊天室。一、基本流程示例代码1、抽象同伴类角色 AbsPeopleusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediatorabstract class AbsPeopleprotected AbsMediator mediator;#region 构造函数public AbsPeople(AbsMediator mediator)this.mediator = mediator;#
5、endregion2、抽象中介类角色 AbsMediatorusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediator/抽象中介类角色 AbsMediator/在这里定义了需要实现的通讯方法abstract class AbsMediator/在 Send 方法中,传入的是 AbsPeople 接口,它是具体 People 类的基类public abstract void Send(string message,AbsPeople people);3
6、、具体同伴类角色 Student 与 Teacherusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediator/定义具体同伴类角色 Student 类Teacher 类4、具体中介类角色 RealMediatorusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediatorclass RealMediator:
7、 AbsMediator /在 Mediator 的具体类中融合了所有相关联的 Peopleprivate Student _pstudent;private Teacher _pteacher;public Student PStudentset _pstudent = value; public Teacher PBset _pteacher = value; public override void Send(string message, AbsPeople people)if(people=_pstudent)_pteacher.Notify(message);if(people=_
8、pteacher)_pstudent.Notify(message);5、客户应用#region 流程示范Console.WriteLine(“-流程示例-“);RealMediator rm = new RealMediator();Student pStudent = new Student(rm);Teacher pTeacher = new Teacher(rm);rm.PStudent = pStudent;rm.PB = pTeacher;pStudent.Send(“老师好 “);pTeacher.Send(“同学们好.“ );Console.ReadKey();#endregi
9、on二、中介者模式实现的聊天室 1、抽象同伴类角色 AbsParticipant using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediator/定义抽象同伴类角色 /此处定义了两个属性,一个是 Name,一个是抽象中介类对象public abstract class AbsParticipantChatRoom 属性,它是 AbsChatRoom 类对象Name 属性构造函数定义其子类需要实现的功能2、抽象中介类角色 AbsChatRoomusing
10、System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediator/定义一个抽象类 AbsChatRoom,它是 RealChatRoom 的基类/此处定义了两个需要实现的功能,一个是注册,一个是发送信息public abstract class AbsChatRoompublic abstract void Register(AbsParticipant participant);public abstract void Send(string from, strin
11、g to, string message);3、具体同伴类角色 Boy 与 Girlusing System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MyMediator/此处定义了两个抽象同伴类角色 AbsParticipant 的子类,一个是 Boy,一个是 Girl男士 Partitcipant 类女士 Participant 类4、具体中介类角色 RealChatRoomusing System;using System.Collections.Generic;usin
12、g System.Linq;using System.Text;namespace MyMediator#region 定义一个具体的 ChatRoom,它继承自抽象类 AbsChatRoom,并实现 AbsChatRoom 定义的功能class RealChatRoom:AbsChatRoom#region 定义一个字典,用于管理参加聊天的人员private Dictionary _participants = new Dictionary();#endregion#region 实现注册功能public override void Register(AbsParticipant parti
13、cipant)/如果新加入一个人,他/ 她不在当前人员列表中,则把此新人加入到列表中if(!_participants.ContainsValue(participant)_participantsparticipant.Name = participant;participant.ChatRoom = this;#endregion#region 实现发送信息功能public override void Send(string from, string to, string message)AbsParticipant pt = _participantsto;if(pt!=null) pt
14、.Receive(from, message); /如果有此人,则调用他/ 她的 Receive 方法#endregion#endregion5、客户应用 #region 聊天室示例Console.WriteLine();Console.WriteLine();Console.WriteLine(“-聊天室示例-“);RealChatRoom room = new RealChatRoom();AbsParticipant WangJun = new Boy(“王军“);AbsParticipant ZhouQiang = new Boy(“周强“);AbsParticipant LiWeiD
15、ong = new Boy(“李卫东“);AbsParticipant YuanHui = new Boy(“袁晖“);AbsParticipant SunLing = new Girl(“孙玲“);AbsParticipant DenLiLi = new Girl(“邓丽丽“);room.Register(WangJun);room.Register(ZhouQiang);room.Register(LiWeiDong);room.Register(YuanHui);room.Register(SunLing);room.Register(DenLiLi);WangJun.Send(“孙玲“
16、 , “你好孙玲“); /此处实质是调用 RealChatRoom 定义的 Send 功能来完成 Send 操作ZhouQiang.Send(“李卫东“, “哥们在吗? “);LiWeiDong.Send(“周强“, “我才上来,今天工作忙不忙? “);YuanHui.Send(“孙玲“ , “昨天看到你哥了“);SunLing.Send(“邓丽丽“ , “作业做完没有?“);DenLiLi.Send(“周强“ , “你是哪里的?“);Console.ReadKey();#endregion程序如下图:运行效果如下:适用性:1.一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。3.想定制一个分布在多个类中的行为,而又不想生成太多的子类。