概念
用一个中介对象来封装一些列的对象交互。终结者使各对象不需要显示的相互引用,从而使得其耦合松散,而且可以独立的改变他们之间的交互。
ps:也称为调停者模式
优点
- 减少类间的依赖,将一对多的一依赖变成了一对一的依赖。
- 降低类间的耦合
- 从宏观(系统)的角度来看待问题(关注点由行为到交互)
缺点
- 中介者复杂性增加
- 因为类的增多,中介者膨胀,其逻辑增加变得复杂
?是否在存在多个依赖关系的情况下就考虑适用中介者模式呢?
不是的,中介者模式也不一定能够将逻辑理清,切存在引入中介者模式后逻辑更复杂的情况(中介者模式的缺点)
- 因为类的增多,中介者膨胀,其逻辑增加变得复杂
适用情况
- 产品开发
- N个对象之间有相互依赖关系
- 多个对象有依赖关系,但是依赖的行为不确定
结构图
角色介绍
- Mediator
抽象中介者,定义了同时角色之间的通信 - Colleague
抽象同时类,同事角色,同事角色知道中介者角色,与其他同事通信时通过中介者 - ConcreteMediator
具体中介者角色,依赖于各个同事角色 - ConcreteColleague
具体的同事类,每个同事类知道自己的行为并知道中介者的存在
实现
- Mediator
abstract class Mediator
{
public abstract void Send(string message, Colleague colleague);//定义一个抽象的发送消息对象,得到同事对象和发送消息
}
- Colleague
abstract 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);
}
}
- ConcreteColleague
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);
}
}
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);
}
}
自结
利用中介模式,同事1和同事2可以交换信息,完成信息传递
其实中介模式就如同一个中间商,作为一个中间者转换两者间的交互