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

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

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

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

目录
相关文章
|
设计模式 前端开发
设计模式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