1、结构图
2、代码
/**********************
* 意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显
* 式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
* 适用性:
* 1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
* 2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
* 3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
* 协作:同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。
* 作者:董怀信
* 日期:2009-06-08
* *********************************************************/
using System;
namespace DesignPattern.BehavioralPattern
{
/// <summary>
/// 中介者定义一个接口用于与各同事(Colleague)对象通信。
/// </summary>
public abstract class Mediator
{
public abstract void Inform();
public abstract void SetColleagues(Colleague colleague1, Colleague colleague2);
}
/// <summary>
/// 具体中介者通过协调各同事对象实现协作行为。
/// 了解并维护它的各个同事。
/// </summary>
public class ConcreteMediator:Mediator
{
Colleague m_colleague1;
Colleague m_colleague2;
public ConcreteMediator()
{
}
public override void SetColleagues(Colleague colleague1, Colleague colleague2)
{
m_colleague1 = colleague1;
m_colleague2 = colleague2;
}
public override void Inform()
{
m_colleague2.ValueChanged();
}
}
/// <summary>
/// 每一个同事类都知道它的中介者对象。
/// 每一个同事对象在与其他同事通讯的时候,与它的中介者通讯。
/// </summary>
public abstract class Colleague
{
protected Mediator m_mediator;
public Colleague(Mediator mediator)
{
m_mediator = mediator;
}
public abstract void ValueChanged();
public abstract void DisplayValue();
}
/// <summary>
/// 具体同事1,实现Colleague接口。
/// </summary>
public class ConcreteColleague1:Colleague
{
private int m_value ;
public ConcreteColleague1(Mediator mediator):base(mediator)
{
m_value = 'A';
}
public override void ValueChanged()
{
m_value++;
m_mediator.Inform();
}
public override void DisplayValue()
{
Console.WriteLine("ConcreteColleague1:DisplayValue:" + m_value.ToString());
}
}
/// <summary>
/// 具体同事2,实现Colleague接口。
/// </summary>
public class ConcreteColleague2 : Colleague
{
private char m_value;
public ConcreteColleague2(Mediator mediator)
: base(mediator)
{
m_value = 'A';
}
public override void ValueChanged()
{
m_value++;
}
public override void DisplayValue()
{
Console.WriteLine("ConcreteColleague2:DisplayValue:" + m_value.ToString());
}
}
/// <summary>
/// 客户测试
/// </summary>
public class Client
{
public void Test()
{
Mediator mediator = new ConcreteMediator();
Colleague colleague1 = new ConcreteColleague1(mediator);
Colleague colleague2 = new ConcreteColleague2(mediator);
mediator.SetColleagues(colleague1, colleague2);
Console.WriteLine("Inital Value:");
colleague1.DisplayValue();
colleague2.DisplayValue();
colleague1.ValueChanged();
Console.WriteLine("colleague1.ValueChanged()");
colleague1.DisplayValue();
colleague2.DisplayValue();
}
}
}