行为型模式-中介者模式

using System;
using System.Collections.Generic;
using System.Text;

namespace 中介者模式
{
/*
* 中介者模式意图:用一个中介者对象将一些列对象交互封装,从而降低这些对象间的耦合性并且可以独立地改变对象间的交互关系。
*
* 中介者模式实现要点:1、添加中间对象(中介者)对需要交互的对象的行为进行管理
* 2、通过中介方法,实现对象间的交互,从而实现对象间交互的松散耦合。
*
* 中介者模式优点:1、通过中介模式可以降低对象间的耦合关系
* 2、可以方便的改变对象间的交互方式和关系
* 3、通过集中控制可以增加代码的复用,如若两个对象需要通过一定特殊的方式通信,可以将其通信方式添加中介中,可以减小对象间对通信方式依赖
*
* 中介者模式缺点:1、通过集中控制的方法,有可能增加代码的发杂性和阅读难度
* 2、中介者模式可能对系统产生性能上的影响,因为所有的通信都是通过中介来通信。
*
* 中介者模式适用场景:1、应用于一组对象以定义良好但是复杂的方法进行通信的场合
* 2、想定制一个分布在多个类中的行为,而不想生成太多的子类的场合。
*/


///<summary>
/// 抽象的中介者,抽象中介
///</summary>
publicabstractclass Mediator
{
publicabstractvoid Send(string message, Colleague collegue);
}

///<summary>
/// 抽象同事类
///</summary>
publicabstractclass Colleague
{
//实现中介注册
protected Mediator mediator;

public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}

///<summary>
/// 具体中介者
///</summary>
publicclass ConcreteMediator : Mediator
{
private ConcreteColleague1 colleague1;

public ConcreteColleague1 Colleague1
{

set { colleague1 = value; }
}
private ConcreteColleague2 colleague2;

public ConcreteColleague2 Colleague2
{

set { colleague2 = value; }
}

///<summary>
/// 中介方法,实现中介者间相互调用,从而实现相间的解耦
///</summary>
///<param name="message"></param>
///<param name="colleague"></param>
publicoverridevoid Send(string message, Colleague colleague)
{
if (colleague==colleague1)
{
colleague2.Notify(message);

}
if (colleague==colleague2)
{
colleague1.Notify(message);

}

}
}

///<summary>
/// 具体同事类
///</summary>
publicclass ConcreteColleague1 : Colleague
{
public ConcreteColleague1(Mediator mediator):base(mediator)
{

}

publicvoid Send(string message)
{
//通过中介实现相互调用
mediator.Send(message, this);
}

publicvoid Notify(string message)
{
//具体需要实现的业务逻辑代码
}
}


publicclass ConcreteColleague2 : Colleague
{
public ConcreteColleague2(Mediator mediator)
:
base(mediator)
{
}

publicvoid Notify(string message)
{
//具体需要实现的代码
}
publicvoid Send(string message)
{
mediator.Send(message,
this);

}
}

publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
ConcreteMediator mediator
=new ConcreteMediator();
ConcreteColleague1 c1
=new ConcreteColleague1(mediator);
ConcreteColleague2 c2
=new ConcreteColleague2(mediator);

//将同事对象注册给中介类
mediator.Colleague1 = c1;
mediator.Colleague2
= c2;

c1.Send(
"C1通过中介者发送到C2的信息");
c2.Send(
"C2通过总结着回应C1的信息");


}
}


}
posted @ 2011-03-22 22:38  日月之明  阅读(334)  评论(0编辑  收藏  举报