设计模式之中介者模式

10/25/2012 10:20:38 AM

名称:中介者模式

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

     适用环境:

     1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。

     2、一个对象引用其他很多对象并且直接与这些对象通信,导致难惟复用该对象。

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

 

    abstractclassMediator

    {

        publicabstractvoidSend(stringmessages,

            Colleaguecolleague);

 

    }

    classConcreteMediator: Mediator

    {

        privateConcreteColleague1_colleague1;

        privateConcreteColleague2_colleague2;

 

        publicConcreteColleague1Colleague1

        {

            set{ _colleague1 = value; }

        }

        publicConcreteColleague2Colleague2

        {

            set{ _colleague2 = value; }

        }

        publicoverridevoidSend(stringmessage,

            Colleaguecolleague)

        {

            if(colleague == _colleague1)

            {

                _colleague2.Notify(message);

            }

            else

            {

                _colleague1.Notify(message);

            }

        }

    }

    abstractclassColleague

    {

        protectedMediatormediator;

        publicColleague(Mediatormediator)

        {

            this.mediator = mediator;

        }

    }

    classConcreteColleague1: Colleague

    {

        publicConcreteColleague1(Mediatormediator)

            : base(mediator)

        {

        }

        publicvoidSend(stringmessage)

        {

            mediator.Send(message, this);

        }

        publicvoidNotify(stringmessage)

        {

            Console.WriteLine("Colleague1 gets message:"

                + message);

        }

    }

    classConcreteColleague2: Colleague

    {

        publicConcreteColleague2(Mediatormediator)

            : base(mediator)

        {

        }

        publicvoidSend(stringmessage)

        {

            mediator.Send(message, this);

        }

        publicvoidNotify(stringmessage)

        {

            Console.WriteLine("Colleague2 gets message:"

                + message);

        }

}

调用:

ConcreteMediatorm = newConcreteMediator();

            ConcreteColleague1cc1 = newConcreteColleague1(m);

            ConcreteColleague2cc2 = newConcreteColleague2(m);

 

            m.Colleague1 = cc1;

            m.Colleague2 = cc2;

            cc1.Send("How are You?");

            cc2.Send("Fine, thanks");

 

输出:

Colleague2 gets message:How are You?

Colleague1 gets message:Fine, thanks