在VS项目开发过程中,我们创建一个页面后,系统为我们自动生成一些代码(.aspx,.cs),一个用于前台控件的摆放、另一个用于编写控件对应的事件操作。例如:我们在双击按钮后,系统自动生成一段Click的代码并在里面填写我们想要的操作。为什么界面上很多的按钮他们相互之间的操作都互不受影响?因为控件在操作的时候,不是自己操作自己,而是产生事件并发送的Form界面;再由Form界面按照接收到的事件,转发到对应的操作中;这样Form就起到中介的作用;这就是中介模式的实际应用案例。
我们先看看定义:用一个中介对象封装一组对象的交互,中介者使得各对象之间不需要显示的进行相互的引用,降低彼此之间的耦合性,而且可以独立的改变他们之间的交互。
代码区域:
中介者做的事情就是传递消息,减少同事类之间单独的耦合;所以必须要有消息发送功能。
abstract class Mediactor { //定义一个抽象的发送消息方法,获取同事对象、消息 public abstract void Send(string message,Colleague colleague); }
同事抽象类,需要知道是哪个中介者对象在帮忙进行传递消息,因此需要声明一个中介者对象存储;
abstract class Colleague { protected Mediactor mediactor; public Colleague(Mediactor mediactor) { this.mediactor =mediactor; } }
具体的同事类,在消息发的时候,需借助于中介者对象,将消息发送出去;
class ConcreteColleague1:Colleague { public ConcreteColleague1(Mediactor mediactor):base(mediactor) {} public void Send(string message) { mediactor.Send(message,this); } public void Notify( string message) { Console.WriteLine("同事1获取的消息:"+message); } } class ConcreteColleague2:Colleague { //将中介者对象传入进去,应需要通过中介者对象传递数据 public ConcreteColleague2(Mediactor mediactor):base(mediactor) {} public void Send(string message) { mediactor.Send(message,this); } public void Notify( string message) { Console.WriteLine("同事2获取的消息:"+message); } }
具体的中介者类,功能相对复杂,它需要知道所有的同事类对象、知道消息是谁传来,是谁需要接受。
//具体的中介类需要定义所有的同事类对象并要处理他们消息相互的传递
class ConcreteMediactor:Mediactor
{
//需要声明所有的同事类对象
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);
}
}
}
客户端代码:
static void Main(string[] arg) { ConcreteMediactor mediactor=new ConcreteMediactor(); ConcreteColleague1 colleague1=new ConcreteColleague1(mediactor); ConcreteColleague2 colleague2=new ConcreteColleague2(mediactor); mediactor.Colleague1=colleague1; mediactor.Colleague2=colleague2; colleague1.Send("借100W?"); colleague2.Send("没有"); }
在这中模式关键点:1.在创建同事类对象时,需要知道中介者是谁(构造方法中初始化赋值);2,具体的中介者类中,需要知道所有的同事类对象信息。因此,如果系统非常庞大的时候就难于管理了。我们在使用的时需要尽量减少使用此模式的应用。用在刀刃上最适合。