设计模式25——中介者模式

06-01 1284阅读

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

中介者模式(Mediator)

对象行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、代码举例

2.1、对象之间的关系用UML图描述如下:

2.2、Java代码如下:


一、概述

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

1.1、直观的理解:

假设现有4个同事类对象,要让他们之间可以两两交互,对比普通方式和中介者模式的区别:

设计模式25——中介者模式

可以看到,在没有使用中介者模式时每个同事类都要产生3个给对方发送消息和3个接收消息的动作,如果是有很多的同事,那么在想要修改时会非常复杂。而使用中介者后,每个同事类只需要1个给中介发消息和1个接收中介者消息的动作,同事类之间的交互都由中介者转发,且都是和中介者进行交互,大大的减少了同事类之间的耦合。

1.2、主要角色:

  • 中介者:中介者的抽象类和接口 + 具体的中介者类,协调同事类们之间的通讯
  • 同事类:同事类的抽象类和接口 + 具体的同事类,需要通讯的对象

    1.3、描述对象之间关系的UML图:

    设计模式25——中介者模式

    (我们会发现,这相当于把同事类之间的交互控制全部放到了中介者类里,此时中介类会变得比任何一个同事类都复杂)

    1.4、适用场景:

    • 一组对象以定义良好但复杂的方式进行通讯,产生的相互依赖关系结构混乱且难以理解
    • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
    • 想定制一个分布在多个类中的行为,而又不想生成太多的子类

      (注:当系统中出现多对多交互复杂的对象时,不要急着使用中介者模式,而要先反思你的系统在设计上是不是合理的)

      二、代码举例

      假设有两个同事类1和2要进行交互。这个例子比较简单,就不再详细分析了。但你可以把本例当做一个模板,然后灵活使用:

      2.1、对象之间的关系用UML图描述如下:

      设计模式25——中介者模式

      2.2、Java代码如下:

      同事类的抽象类:

      abstract class Colleague {
          protected Mediator mediator;
          public Colleague(Mediator mediator) {
              this.mediator = mediator;
          }
      }
      

      同事类1:

      public class ConcreteColleague1 extends Colleague {
          public ConcreteColleague1(Mediator mediator) {
              super(mediator);
          }
          public void send(String message) {
              this.mediator.send(message, this);
          }
          public void notify(String message) {
              System.out.println("同事1收到信息:" + message);
          }
      }
      

      同事类2:

      public class ConcreteColleague2 extends Colleague {
          public ConcreteColleague2(Mediator mediator) {
              super(mediator);
          }
          public void send(String message) {
              this.mediator.send(message, this);
          }
          public void notify(String message) {
              System.out.println("同事2收到信息:" + message);
          }
      }
      

      中介者的抽象类:

      abstract class Mediator {
          public abstract void send(String message, Colleague colleague);
      }
      

      具体的中介者的类:

      public class ConcreteMediator extends Mediator {
          private ConcreteColleague1 colleague1;
          private ConcreteColleague2 colleague2;
          public void setColleague1(ConcreteColleague1 colleague1) {
              this.colleague1 = colleague1;
          }
          public void setColleague2(ConcreteColleague2 colleague2) {
              this.colleague2 = colleague2;
          }
          @Override
          public void send(String message, Colleague colleague) {
              if (colleague == this.colleague1){
                  this.colleague2.notify(message);
              } else{
                  this.colleague1.notify(message);
              }
          }
      }
      

      主程序(发起请求的类):

      public class Main {
          public static void main(String[] args) {
              ConcreteMediator mediator = new ConcreteMediator();
              ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
              ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
              mediator.setColleague1(colleague1);
              mediator.setColleague2(colleague2);
              colleague1.send("你好吗?");
              colleague2.send("我很好。");
          }
      }
      

      这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

      如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

      设计模式25——中介者模式

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码