中介者模式(Mediator):用一个中介者对象来封装一系列的对象交互。中介者对象使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
优点:Mediator的出现减少了各个Colleague的耦合,便使得可以独立的改变和复用各个Colleague和Mediator,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
使用场合:中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在各个类中的行为,而又不想生成太多的子类的场合。
- using System;
- using System.Collections.Generic;
- /**概述
- * 中介者模式(Mediator):用一个中介者对象来封装一系列的对象交互。中介者对象使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
- * 优点:Mediator的出现减少了各个Colleague的耦合,便使得可以独立的改变和复用各个Colleague和Mediator,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。
- * 使用场合:中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在各个类中的行为,而又不想生成太多的子类的场合。
- */
- namespace StuDesignMode.Mediator
- {
- interface IMediator
- {
- void Send(string message,AbsColleague colleague);
- }
- abstract class AbsColleague
- {
- protected IMediator Mediator { get; set; }
- public AbsColleague(IMediator mediator)
- {
- this.Mediator = mediator;
- }
- }
- class ConcreteMediator : IMediator
- {
- private ConcreteColleague1 _colleague1;
- private ConcreteColleague2 _colleague2;
- public ConcreteColleague1 Colleague1 { set { this._colleague1 = value; } }
- public ConcreteColleague2 Colleague2 { set { this._colleague2 = value; } }
- public void Send(string message, AbsColleague colleague)
- {
- if (colleague == _colleague1)
- {
- _colleague2.Notify(message);
- }
- else if (colleague == _colleague2)
- {
- _colleague1.Notify(message);
- }
- }
- }
- class ConcreteColleague1 : AbsColleague
- {
- public ConcreteColleague1(IMediator mediator) : base(mediator) { }
- public void Send(string message)
- {
- this.Mediator.Send(message,this);
- }
- public void Notify(string message)
- {
- Console.WriteLine("同事一得到消息:{0}",message);
- }
- }
- class ConcreteColleague2 : AbsColleague
- {
- public ConcreteColleague2(IMediator mediator) : base(mediator) { }
- public void Send(string message)
- {
- this.Mediator.Send(message, this);
- }
- public void Notify(string message)
- {
- Console.WriteLine("同事二得到消息:{0}",message);
- }
- }
- class ClientTest
- {
- static void Main(string[] args)
- {
- ConcreteMediator mediator = new ConcreteMediator();
- ConcreteColleague1 coll1 = new ConcreteColleague1(mediator);
- ConcreteColleague2 coll2 = new ConcreteColleague2(mediator);
- mediator.Colleague1 = coll1;
- mediator.Colleague2 = coll2;
- coll1.Send("吃饭了么?");
- coll2.Send("还没呢,你呢?");
- }
- }
- }