• 『设计模式』电话接线员与中介者模式


    23种设计模式+额外常用设计模式汇总 (持续更新)

    引入

    • 在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。
    • 在系统比较小的时候,可能对象间的通信不是很多、对象也比较少之我们可以直接硬编码到各个对象的方法中。
    • 当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是Mediator模式。
    • Mediator模式将对象间的交互和通信封装在一个类中,各个对象间的通信不必显式去声明和引用,大大降低了系统的复杂性能(了解一个对象总比深入熟悉n个对象要好)。
    • Mediator模式还带来了系统对象间的松耦合

    定义

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

    模式结构

    在这里插入图片描述

    • Mediator模式中,各个Colleague维护-一个Mediator,.当要进行交互,例如图中ConcreteCoHeague1和ConcreteColleague2之间的交互就可以通过ConcreteMediator提供的方法来处理
    • ConcreteColleague1和ConcreteColleague2不必维护对各自的引用,甚至它们也不知道各个的存在。Mediator通过这种方式将多对多的通信简化为了一(Mediator)对多(Colleague) 的通信。

    优点

    • Mediator模式是一种很有用并且很常用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
    • Mediator还获得系统解耦的特性,通过Mediator,各个Colleague就不必维护各自通信的对象和通信协议,降低了系统的耦合性,Mediator和各个Colleague就可以相互独立地修改了。
    • Mediator模式还有一个很显著的特点就是将控制集中,集中的优点就是便于管理,也正符合了OO设计中的每个类的职责要单一和集中的原则。

    缺点

    • 由于控制的集中化,于是把交互复杂性变味了中介者的复杂性,这就使得中介者会变得比任何一个- ConcreteColleague都复杂。

    门面模式和中介者模式

    • 门面(Facade)模式和中介者(Mediator)模式有着共同的目的。它们都是调配一组相互耦合的对象的通信。不过门面模式关注的是这组复杂对象如何与外界通信,而中介者模式是调配这组复杂对象之间的通信。
    • 可以组合使用,来实现当同事对象发生改变的时候,通知中介对象,让中介对象去进行与其他相关对象的交互

    本质

    • 封装交互
      一个类知道信息越少越好,随着ConcreteColleague的数量的变多,如果不采用中介者模式的话,那么每两个类之间实现通信的话是(N-1)N/2的连接,先不说原则不原则的事情,当到10个ConcreteColleague类的时候就要写25次通信,那么复制粘贴也要很久。为了能够使多个对象能够实现通信,所以采用中介者模式。

    实现

    package 中介者模式
     
        //抽象同事类
     public   abstract class Colleague
        {
            protected Mediator mediator;
    
            public Colleague(Mediator mediator)
            {
                this.mediator = mediator;
            }
        }
    
    package 中介者模式
     public   abstract class Mediator
        {
            public abstract void Send(string message, Colleague colleague);
        }
        
    package 中介者模式
        //具体同事类
       public class ConcreteColleague1 extends Colleague
        {
            public ConcreteColleague1(Mediator mediator)   { super( mediator);}
    
            public void Send(string message)
            {
                mediator.Send(message, this);
            }
    
            public void Notify(string message)
            {
            System.out.println ("同事1得到信息:" + message);
            }
        }
    
     public   class ConcreteColleague2 extends  Colleague
        {
            public ConcreteColleague2(Mediator mediator)  { super( mediator);}
    
    
            public void Send(string message)
            {
                mediator.Send(message, this);
            }
    
            public void Notify(string message)
            {
              System.out.println ("同事1得到信息:" + message);
            }
        }
        //具体中介者类
     public   class ConcreteMediator extends Mediator
        {
            private ConcreteColleague1 colleague1;
            private ConcreteColleague2 colleague2;
    
            public setColleague1(ConcreteColleague1 Colleague1)
            {
                 this.Colleague1=Colleague1;
            }
    
             public setColleague1(ConcreteColleague2 Colleague2)
            {
                 this.Colleague2=Colleague2;
            }
    
    
            public override void Send(string message, Colleague colleague)
            {
                if(colleague==colleague1)
                {
                    colleague2.Notify(message);
                }
                else
                {
                    colleague1.Notify(message);
                }
            }
        }
        public class Program
        {
            public static 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("XXXXXXX");
                c2.Send("YYYYYYY");
                Console.Read();
            }
        }
    }
    
    
  • 相关阅读:
    go语言基础之安装go开发环境和beego
    mysql之事件的开启和调用
    系统和应用监控指标
    常用的17个运维监控系统(必备知识)
    Kafka Java API操作topic
    Linux安装mysql8.0
    mybatis+Oracle 批量插入数据,有数据做更新操作
    ORACLE数据库导出表,字段名,长度,类型,字段注释,表注释语句
    ORACLE 按时间创建分区表
    oracle创建表空间和用户
  • 原文地址:https://www.cnblogs.com/lunatic-talent/p/13499486.html
Copyright © 2020-2023  润新知