一、概念
①、什么是中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间地交互。
②、主要解决什么问题?
对象之间相互连接的激增,引起的对象之间的高耦合
③、如何解决
定义一个中介者Mediator,将对象之间的行为转移到交互上。
④、什么时候使用?
一般应用于一组对象以定义良好但是复杂的方式进行通信的场合
⑥、优缺点
优点
- 避免了对象之间的行为,减少了对象之间的耦合
缺点 - 控制集中化,加大了中介者的复杂性
二、图
Colleague类:叫做抽象同事类,
ConcreteColleague是具体同事类,每一个具体同事类只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象,
Mediator是抽象中介者,定义了同事对象到中介者对象的接口,
ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事类接收信息,像具体同事对象发出命令。
三、代码
①、中介者模式
Mediator类:抽象中介类
//中介者类 abstract class Mediator { public abstract void Send(string message, Colleague colleague);//定义一个抽象的发送消息方法,得到同事对象和发送信息。 }
Colleague类:抽象同事类,需要得到中介者对象
//抽象同事类 class Colleague { protected Mediator mediator; public Colleague (Mediator mediator ) { this.mediator = mediator;//构造方法,得到中介者对象。 } }
ConcreteMediator类:需要了解所有具体同事对象,收到信息并且通知具体对象
//具体中介者 class ConcreteMediator:Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2; public ConcreteColleague1 Colleague1 //需要了解具体同事对象 { set { colleague1 = value; } } public ConcreteColleague2 Colleague2 { set { colleague2 = value; } }
public override void Send(string message, Colleague colleague)//重写发送信息方法,根据对象做出判断,通知对象 { if (colleague==colleague1 ) { colleague2.Notify(message); } else { colleague1.Notify(message); } } }
ConcreteColleague1-2具体同事对象,具有自己的行为,并且知道中介者对象
//具体同事类1 class ConcreteColleague1:Colleague { public ConcreteColleague1 (Mediator mediator ):base(mediator ) { } public void Send (string message) { mediator.Send(message, this);//发送消息时通常是中介者发出去的 } public void Notify(string message) { Console.WriteLine("同事1得到信息:" +message); } }
//具体同事类2
class ConcreteColleague2:Colleague { public ConcreteColleague2 (Mediator mediator ):base(mediator) { }//构造方法 public void Send(string message) //发送信息由中介者发出 { mediator.Send(message, this); } public void Notify(string message) //得到信息 { Console.WriteLine("同事2得到信息:"+message); } }
客户端代码
s
tatic void Main(string[] args) { ConcreteMediator m = new ConcreteMediator(); ConcreteColleague1 c1 = new ConcreteColleague1(m );//让两个具体同事类认识中介者对象 ConcreteColleague2 c2 = new ConcreteColleague2(m); m.Colleague1 = c1; //让中介者认识各个具体同事类的对象 m.Colleague2 = c2; c1.Send("次饭了吗?");//具体类同事类发出信息都是通过中介者转发 c2.Send("没有呢,你请客?"); Console.Read(); }
②、实例(安理会做中介)
客户端代码
static void Main(string[] args) { UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();//用联合国安全理事会类实例化一个UNSC对象 USA c1 = new USA(UNSC); //用Usa实例化一个C1对象(UNSC) Iraq c2 = new Iraq(UNSC); UNSC.Colleague1 = c1; //调用UNSC的Colleague1并赋一个C1 UNSC.Colleague2 = c2; c1.Declare("不准研制核武器,否则要发动战争!"); //调用c1的显示方法 c2.Declare("我们没有核武器,也不怕侵略。"); Console.Read(); }
抽象机构联合国机构类
//联合国机构 abstract class UnitedNations { /// <summary> /// 声明 /// </summary> /// <param name="message">声明信息</param> /// <param name="colleague">声明国家</param> public abstract void Declare(string message, Country colleague);//定义一个抽象的发送信息方法,得到国家对象和发送信息 }
具体机构联合国安理会类
//联合国安全理事会 class UnitedNationsSecurityCouncil : UnitedNations { private USA colleague1; private Iraq colleague2; public USA Colleague1 { set { colleague1 = value; } } public Iraq Colleague2 { set { colleague2 = value; } } public override void Declare(string message, Country colleague) { if (colleague == colleague1) { colleague2.GetMessage(message); } else { colleague1.GetMessage(message); } } }
抽象国家类
//国家 abstract class Country { protected UnitedNations mediator; public Country(UnitedNations mediator) //构造方法得到Mediator { this.mediator = mediator; } }
具体国家类
//美国 class USA : Country { public USA(UnitedNations mediator) : base(mediator) { } //声明 public void Declare(string message) { mediator.Declare(message, this); //mediator发送信息 } //获得消息 public void GetMessage(string message) { Console.WriteLine("美国获得对方信息:" + message); } } //伊拉克 class Iraq : Country { public Iraq(UnitedNations mediator) : base(mediator) { } //声明 public void Declare(string message) { mediator.Declare(message, this); } //获得消息 public void GetMessage(string message) { Console.WriteLine("伊拉克获得对方信息:" + message); } }
六、涉及到的知识点
1.本例涉及到的关系
关联:表现为一个类知道另一个类
实现:
class Penguin :Bird { private Climate climate;//在企鹅Penguin中,引用到气候Climate对象 }
图形:实线+箭头