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

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

一、概念

①、什么是中介者模式

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

②、主要解决什么问题?

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

③、如何解决

定义一个中介者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对象
 }

图形:实线+箭头



目录
相关文章
|
设计模式 前端开发
设计模式21 - 中介者模式【【Mediator Pattern】
设计模式21 - 中介者模式【【Mediator Pattern】
51 0
|
设计模式 调度
行为型设计模式09-中介者模式
行为型设计模式09-中介者模式
41 0
|
2月前
|
设计模式 Java
Java设计模式-中介者模式(20)
Java设计模式-中介者模式(20)
|
3月前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 中介者模式
js设计模式【详解】—— 中介者模式
65 5
|
5月前
|
设计模式
中介者模式-大话设计模式
中介者模式-大话设计模式
|
5月前
|
设计模式 Java 程序员
Java设计模式之中介者模式详解
Java设计模式之中介者模式详解
|
5月前
|
设计模式
设计模式之中介者模式
设计模式之中介者模式
|
5月前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
208 0
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~中介者模式
[设计模式 Go实现] 行为型~中介者模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78