设计模式之中介者模式

名词解释:

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而可以独立地改变它们之间的交互。

必要元素:

抽象对象类:就是用于交互的对象的抽象类;
具体类:继承自抽象对象类(也就是用于交互的一个个对象的类);
抽象中介者:定义了具体对象到中介者对象的接口;
具体中介者对象:实现抽象类的方法,它需要知道所有具体对象类,并从具体类接收消息,向具体对象发出命令。

例子:

抽象中介者类:

   abstract class Mediator
    {
       public abstract void Send(string message,Colleague colleague);
    }

仅仅定义了用于分发消息的方法。
具体中介者类:

  class ConcreteMediator:Mediator
    {
        private ConcreteColleague1 colleague1;

        internal ConcreteColleague1 Colleague1
        {
            set { colleague1 = value; }
        }
        private ConcreteColleague2 colleague2;

        internal ConcreteColleague2 Colleague2
        {
            set { colleague2 = value; }
        }
        public override void Send(string message, Colleague colleague)
        {
            if (colleague == colleague1)
            {
                colleague1.Notify(message);
            }
            else
            {
                colleague2.Notify(message);
            }
        }
    }

其中包含了Colleageu1和Colleague2分别为具体对象1和具体对象2,主要是Send方法的重写,根据Colleague来分别向其发送消息。
抽象对象类:

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

构造函数必须传入一个中介者,这样才可以将不同的对象关联起来(在不相互引用的情况下)。
具体对象类1:

 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);
        }
    }

具体对象2:

    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);
        }
    }

具体对象1和具体对象2的代码几乎一样,唯一区别就是自己的Notify显示的自己的信息。整个类中主要就是Send和Notify方法,Send用于在外部向其传递消息,然后通过中介者将消息分发出去,中介者再根据具体对象,调用对应对象的Notify方法。
调用:

        ConcreteMediator mediator = new ConcreteMediator();
            ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
            ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

            mediator.Colleague1 = colleague1;
            mediator.Colleague2 = colleague2;

            colleague1.Send("今天吃什么?");
            colleague2.Send("随便!");

            Console.Read();

实例化了一个中介者对象,和两个具体对象,在实例化具体对象时候将中介者对象传入,这样就将中介者和具体对象关联了起来。然后可以根据自己的需要进行访问具体对象1或者具体对象2,然后两个具体对象在互不引用的情况下,实现了信息的交互(传递).

总结:

 中介者模式的优点,首先是Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator;其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各个本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

中介者模式一般应用于一组对象以 良好但是复杂的方式进行通信的场合,以及象定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

posted @ 2013-09-22 18:43  wangyafei_it  阅读(364)  评论(0编辑  收藏  举报