设计模式轻松学【二二】中介者模式

简介: 中介可以将系统由复杂的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用

没有中介的情况(网状结构)

image.png

有中介的情况(星形结构)

image.png

定义与特点

  • 定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用,是对象行为型模式。
  • 参与角色

    • 抽象中介者(Mediator)角色:提供了(同事对象注册)与(转发同事对象信息)的抽象方法。
    • 具体中介者(ConcreteMediator)角色:实现抽象中介者的方法,所有的具体同事类都由它来管理(list),同时做同事间的信息接收、转发工作。
    • 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
    • 具体同事类(Concrete Colleague)角色:每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
  • 类结构图

image.png

  • 结构代码示例

    • 定义抽象中介者

      abstract class Mediator {
          public abstract void register(Colleague colleague);
      
          public abstract void relay(Colleague cl); // 转发
      }
    • 定义抽象同事类

      abstract class Colleague {
          protected Mediator mediator;
      
          public void setMedium(Mediator mediator) {
              this.mediator = mediator;
          }
      
          public abstract void receive();
      
          public abstract void send();
      }
    • 定义具体中介者

      class ConcreteMediator extends Mediator {
          private List<Colleague> colleagues = new ArrayList<Colleague>();
      
          public void register(Colleague colleague) {
              if (!colleagues.contains(colleague)) {
                  colleagues.add(colleague);
                  colleague.setMedium(this);
              }
          }
      
          public void relay(Colleague cl) {
              for (Colleague ob : colleagues) {
                  if (!ob.equals(cl)) {
                      ((Colleague) ob).receive();
                  }
              }
          }
      }
    • 定义具体同事类

      //具体同事类
      class ConcreteColleague1 extends Colleague {
          public void receive() {
              System.out.println("具体同事类1收到请求。");
          }
      
          public void send() {
              System.out.println("具体同事类1发出请求。");
              mediator.relay(this); // 请中介者转发
          }
      }
      
      //具体同事类
      class ConcreteColleague2 extends Colleague {
          public void receive() {
              System.out.println("具体同事类2收到请求。");
          }
      
          public void send() {
              System.out.println("具体同事类2发出请求。");
              mediator.relay(this); // 请中介者转发
          }
      }
    • 客户端调用

      public class MediatorTest {
      
          public static void main(String[] args) {
              //声明中介者
              Mediator mediator = new ConcreteMediator();
              
              Colleague colleague1 = new ConcreteColleague1();
              Colleague colleague2 = new ConcreteColleague2();
              //同事相继注册
              mediator.register(colleague1);
              mediator.register(colleague2);
              
              colleague1.send();
              System.out.println("---------------");
              colleague2.send();
              
          }
      }
      
      //运行结果
      具体同事类1发出请求。
      具体同事类2收到请求。
      ---------------
      具体同事类2发出请求。
      具体同事类1收到请求。

案例分析

租客租房案例,租客在寻找房源时与中介联系,中介再与房东联系

  • 定义抽象中介者

    //抽象中介者:中介公司
    interface Medium {
        void register(Customer member); // 客户注册
    
        void relay(String from, String message); // 转发
    }
  • 定义抽象同事类

    //抽象同事类:客户
    abstract class Customer {
        protected Medium medium;
        
        private String name;
        
        public Customer(String name) {
            this.name = name;
        }
        
        public void setMedium(Medium medium) {
            this.medium = medium;
        }
    
        public String getName() {
            return name;
        }
    
        public abstract void send(String message);
    
        public abstract void receive(String from, String message);
    }
  • 定义具体中介者

    //具体中介者:房地产中介
    class EstateMedium implements Medium {
    
        private List<Customer> members = new ArrayList<Customer>();
    
        public void register(Customer member) {
            if (!members.contains(member)) {
                members.add(member);
                member.setMedium(this);
            }
        }
    
        public void relay(String from , String message) {
            for (Customer ob : members) {
                String name = ob.getName();
                if (!name.equals(from)) {
                    ((Customer) ob).receive(from, message);
                }
            }
        }
    }
  • 定义具体同事类

    //具体同事类:卖方
    class Seller extends Customer {
        public Seller(String name) {
            super(name);
        }
        @Override
        public void send(String message) {
            medium.relay(getName() , message);
        }
    
        @Override
        public void receive(String from, String message) {
            System.out.println(from + "说: " + message);
        }
    }
    
    //具体同事类:买方
    class Buyer extends Customer {
    
        public Buyer(String name) {
            super(name);
        }
    
        @Override
        public void send(String message) {
            medium.relay(getName() , message);
        }
    
        @Override
        public void receive(String from, String message) {
            System.out.println(from + "说: " + message);
        }
    }
  • 调用客户端

    public class MediatorTest {
    
        public static void main(String[] args) {
            // 声明中介者
            Medium mediator = new EstateMedium();
    
            Customer seller = new Seller("张房东");
            Customer buyer = new Buyer("李租客");
            // 同事相继注册
            mediator.register(seller);
            mediator.register(buyer);
    
            buyer.send("你好,房子多少钱一个月");
            System.out.println("--------------");
            seller.send("3000,少一分不租");
        }
    }
    //运行结果
    李租客说: 你好,房子多少钱一个月
    --------------
    张房东说: 3000,少一分不租

总结

  1. 优点

    • 降低了系统对象之间的耦合性,使得对象易于独立的被复用。
    • 提高系统的灵活性,使得系统易于扩展和维护。
  2. 缺点

    模式使系统更加复杂,使得系统维护比较困难,当业务复杂时,中介者承担的责任非常大

  3. 适用场景

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

image.png

相关文章
|
6月前
|
设计模式 前端开发
设计模式21 - 中介者模式【【Mediator Pattern】
设计模式21 - 中介者模式【【Mediator Pattern】
23 0
|
6月前
|
设计模式 调度
行为型设计模式09-中介者模式
行为型设计模式09-中介者模式
22 0
|
6月前
|
设计模式 C++
设计模式之中介者模式(C++)
设计模式之中介者模式(C++)
|
3天前
|
设计模式 调度
【设计模式系列笔记】中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过将对象之间的直接通信转移到一个中介对象中,来减少对象之间的耦合度。这种模式被用来处理一个对象与其他对象之间的交互,使得各对象之间不需要直接相互了解。
13 0
|
2月前
|
设计模式 前端开发
浅谈设计模式 - 中介者模式(十六)
浅谈设计模式 - 中介者模式(十六)
36 0
|
3月前
|
设计模式 Java 数据库连接
聊聊Java设计模式-中介者模式
中介者(Mediator)模式指定义了一个单独的中介对象,来封装一组对象之间的交互。即将这组对象之间的交互委派给中介对象,从而来避免对象之间的直接交互。
51 1
|
4月前
|
设计模式
二十三种设计模式全面解析-解放组件间的通信束缚:深入探讨中介者模式的高级应用和进阶技巧
二十三种设计模式全面解析-解放组件间的通信束缚:深入探讨中介者模式的高级应用和进阶技巧
|
4月前
|
设计模式
二十三种设计模式全面解析-解密中介者模式:构建灵活的通信桥梁
二十三种设计模式全面解析-解密中介者模式:构建灵活的通信桥梁
|
4月前
|
设计模式 Java
Java设计模式【十八】:中介者模式
Java设计模式【十八】:中介者模式
22 0
|
5月前
|
设计模式 前端开发 uml
认真学习设计模式之中介者模式(Mediator Pattern)
认真学习设计模式之中介者模式(Mediator Pattern)
31 0