一、概念
①、什么是中介者模式
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变他们之间地交互。
②、主要解决什么问题?
对象之间相互连接的激增,引起的对象之间的高耦合
③、如何解决
定义一个中介者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对象
}
图形:实线+箭头