您的位置:首页 > 其它

中介者模式

2016-02-13 17:58 316 查看

中介者模式:

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

需要一个中间人或者调停者;系统分割成许多对象——增加复用性

结构图:



优缺点:

由于concretemediator控制了集中化,于是把交互复制性变成了中介者的复杂性

减少了同事类colleague的耦合,可以独立地改变或复用各个colleague类和mediator

应用于:

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

一组对象以定义良好但是复杂的方式进行通信的场合:form窗体上的控件以窗体为中介

书中的例子讲的很形象,通过安理会这个中介使得美国和伊拉克这两个国家通信、得以灵活地交互。

代码举例;

class Program
    {
        static void Main(string[] args)
        {
            UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();

            USA c1 = new USA(UNSC);//对象了解中介
            Iraq c2 = new Iraq(UNSC);

            UNSC.Colleague1 = c1;//中介认识对象
            UNSC.Colleague2 = c2;

            c1.Declare("\n不准研制核武器,否则要发生战争");//通过中介发送消息
            c2.Declare("\n我们没有核武器,也不怕侵略");

            Console.Read();
        }
    }
    abstract class UniteNations   //联合国:抽象中介者
    {
        //声明;抽象的发送消息方法,得到同事消息、发送消息
        public abstract void Declare(string message, Country colleague);
    }
    abstract class Country//国家、抽象同事类
    {
        protected UniteNations mediator;
        public Country (UniteNations mediator)
        {
            this.mediator = mediator;//得到中介者
        }
    }
    class USA:Country//具体同事类:美国
    {
        public USA(UniteNations mediator) : base(mediator) 
        { }
        public void Declare(string message)//发送消息是安理会Unsc发送的
        {
            mediator.Declare(message, this);//调用
        }
        public void GetMessage(string message)//获得消息
        {
            Console.WriteLine("\n美国获得对方消息"+message );
        }
    }
    class Iraq:Country
    {
        public Iraq(UniteNations mediator) : base(mediator) 
        { }
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }
        public void GetMessage(string message)
        {
            Console.WriteLine("伊拉克获得消息"+message );
        }
    }
    class UnitedNationsSecurityCouncil : UniteNations//具体中介类
    {
        private USA colleague1;//安理会了解所有国家
        private Iraq colleague2;//所以拥有美国、伊拉克对象属性
        public USA Colleague1
        {
            set { colleague1 = value; }
        }
        public Iraq Colleague2
        {
            set { colleague2 = value; }
        }
        //重写了“声明”方法,实现了两个对象间的通信
        public override void Declare(string message, Country colleague)
        {
            if (colleague ==colleague1 )//根据对象作出选择判断
            {
                colleague2.GetMessage(message);//通知对象
            }
            else//如果是伊朗则美国收到消息
            {
                colleague1.GetMessage(message);
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: