大话设计模式——中介者模式

简介: 大话设计模式——中介者模式

一、概念

①、什么是中介者模式

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

②、主要解决什么问题?

对象之间相互连接的激增,引起的对象之间的高耦合

③、如何解决

定义一个中介者Mediator,将对象之间的行为转移到交互上。

④、什么时候使用?

一般应用于一组对象以定义良好但是复杂的方式进行通信的场合

⑥、优缺点

优点

  1. 避免了对象之间的行为,减少了对象之间的耦合
    缺点
  2. 控制集中化,加大了中介者的复杂性

二、图


Colleague类:叫做抽象同事类,

ConcreteColleague是具体同事类,每一个具体同事类只知道自己的行为,而不了解其他同事类的情况,但他们却都认识中介者对象,

Mediator是抽象中介者,定义了同事对象到中介者对象的接口,

ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事类接收信息,像具体同事对象发出命令。

三、代码

①、中介者模式

Mediator类:抽象中介类

//中介者类
   abstract  class Mediator
    {
        public abstract void Send(string message, Colleague colleague);//定义一个抽象的发送消息方法,得到同事对象和发送信息。
    }

Colleague类:抽象同事类,需要得到中介者对象

//抽象同事类
    class Colleague
    {
        protected Mediator mediator;
        public Colleague (Mediator mediator )
        {
            this.mediator = mediator;//构造方法,得到中介者对象。
        }
    }

ConcreteMediator类:需要了解所有具体同事对象,收到信息并且通知具体对象

//具体中介者
    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);
        }
    }
}

ConcreteColleague1-2具体同事对象,具有自己的行为,并且知道中介者对象

//具体同事类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);
        }
    }

客户端代码

s

tatic void Main(string[] args)
        {
            ConcreteMediator m = new ConcreteMediator();
            ConcreteColleague1 c1 = new ConcreteColleague1(m );//让两个具体同事类认识中介者对象
            ConcreteColleague2 c2 = new ConcreteColleague2(m);
            m.Colleague1 = c1;                                      //让中介者认识各个具体同事类的对象
            m.Colleague2 = c2;
            c1.Send("次饭了吗?");//具体类同事类发出信息都是通过中介者转发
            c2.Send("没有呢,你请客?");
            Console.Read();
        }

②、实例(安理会做中介)

客户端代码

static void Main(string[] args)
        {
            UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil();//用联合国安全理事会类实例化一个UNSC对象
            USA c1 = new USA(UNSC);                                                //用Usa实例化一个C1对象(UNSC)
            Iraq c2 = new Iraq(UNSC);
            UNSC.Colleague1 = c1;                                                   //调用UNSC的Colleague1并赋一个C1
            UNSC.Colleague2 = c2;
            c1.Declare("不准研制核武器,否则要发动战争!");                         //调用c1的显示方法
            c2.Declare("我们没有核武器,也不怕侵略。");
            Console.Read();
        }

抽象机构联合国机构类

//联合国机构
    abstract class UnitedNations
    {
        /// <summary>
        /// 声明
        /// </summary>
        /// <param name="message">声明信息</param>
        /// <param name="colleague">声明国家</param>
        public abstract void Declare(string message, Country colleague);//定义一个抽象的发送信息方法,得到国家对象和发送信息
    }

具体机构联合国安理会类

//联合国安全理事会
    class UnitedNationsSecurityCouncil : UnitedNations
    {
        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);
            }
        }
    }

抽象国家类

//国家
    abstract class Country
    {
        protected UnitedNations mediator;
        public Country(UnitedNations mediator)                              //构造方法得到Mediator
        {
            this.mediator = mediator;
        }
    }

具体国家类

 //美国
    class USA : Country
    {
        public USA(UnitedNations mediator)
            : base(mediator)
        {
        }
        //声明
        public void Declare(string message)
        {
            mediator.Declare(message, this);                            //mediator发送信息
        }
        //获得消息
        public void GetMessage(string message)
        {
            Console.WriteLine("美国获得对方信息:" + message);
        }
    }
    //伊拉克
    class Iraq : Country
    {
        public Iraq(UnitedNations mediator)
            : base(mediator)
        {
        }
        //声明
        public void Declare(string message)
        {
            mediator.Declare(message, this);
        }
        //获得消息
        public void GetMessage(string message)
        {
            Console.WriteLine("伊拉克获得对方信息:" + message);
        }
    }

六、涉及到的知识点

1.本例涉及到的关系


关联:表现为一个类知道另一个类

实现:

class Penguin :Bird
{
  private Climate climate;//在企鹅Penguin中,引用到气候Climate对象
 }

图形:实线+箭头



目录
相关文章
|
10月前
|
设计模式
【大话设计模式】结构型模式总结
【大话设计模式】结构型模式总结
|
10月前
|
设计模式
大话设计模式之享元模式
大话设计模式之享元模式
|
10月前
|
设计模式
【大话设计模式】行为型模式总结
【大话设计模式】行为型模式总结
|
10月前
|
设计模式
【大话设计模式】创建型模式总结
【大话设计模式】创建型模式总结
|
10月前
|
设计模式
大话设计模式——解释器模式
大话设计模式——解释器模式
54 0
|
10月前
|
设计模式 安全
大话设计模式之组合模式
大话设计模式之组合模式
|
10月前
|
设计模式
大话设计模式之装饰模式
大话设计模式之装饰模式
|
10月前
|
设计模式 C++
【大话设计模式】设计模式的六种关系
【大话设计模式】设计模式的六种关系
|
10月前
|
设计模式
大话设计模式结构型分析
大话设计模式结构型分析
|
10月前
|
设计模式
大话设计模式-职责链模式
大话设计模式-职责链模式
32 0