【设计模式】中介者模式

来源:互联网 发布:java中异步请求 编辑:程序博客网 时间:2024/05/16 10:24

中介者模式

          Mediator,又称调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

 

优点

       首先,Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator

      其次,由于把对象如何协作进行了抽象,将中介作为要给独立的概念并将其封装在要给对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来了,也就是站在一个更宏观的角度去看待对象。


缺点

       由于ColleagueMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

 

使用场景

1、一组对象以定义良好但是复杂的方式节能型通信的额场合;

2、想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。


代码结构

结构图


代码示例

abstract class Mediator    {        //定义一个抽象的发送消息方法,得到同事对象和发送消息        public abstract void Send(string message, Colleague colleague);       }
 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);            }        }    }
 abstract class Colleague    {        protected Mediator mediator;        public Colleague(Mediator mediator)        {            this.mediator = mediator;     //构造方法,得到中介者对象        }    }
    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);        }    }


2 0