• 聊聊设计模式——中介者模式


    目录

    中介者模式定义

    优点

    缺点

    结构说明

    工作流程

    代码练习

    应用场景

    本质

    设计原则

    相关设计模式

    开源框架中的应用


    中介者模式定义

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

    优点

    1. 减少耦合:中介者模式降低了对象之间的直接依赖关系,使得系统更加灵活、可维护和可扩展。

    2. 集中控制:中介者模式集中了对象之间的通信和控制,使得系统的行为更加可控。

    3. 复用性:中介者对象可以被多个同事对象共享,促进了代码的复用。

    缺点

    1. 复杂性增加:引入中介者对象可能会增加系统的复杂性,因为它需要维护对象之间的通信关系。

    2. 中介者对象的单一性:中介者对象可能成为系统中的单点故障,一旦中介者对象出现问题,整个系统的通信将受到影响。

    结构说明

    1. 中介者接口(Mediator Interface):定义了中介者对象必须实现的方法,用于处理对象之间的交互。

    2. 具体中介者类(Concrete Mediator):实现了中介者接口,负责协调和管理各个同事对象之间的通信。

    3. 同事类(Colleague):每个同事对象都知道中介者对象,并与中介者通信。同事对象之间的通信不直接发生,而是通过中介者进行的。

    工作流程

    1. 各个同事对象将需要交互的信息发送给中介者。

    2. 中介者接收到信息后,根据信息的内容和发送者的身份,决定如何处理这些信息。

    3. 中介者将处理结果发送给相关的同事对象。

    4. 同事对象根据中介者发送的结果来执行相应的操作。

    代码练习

    将对象之间的通信集中在一个中介者对象中,以减少对象之间的直接依赖关系。

    1.创建中介者接口,提供对象交互使用的sendMessage()方法。

    public interface Mediator {
        void sendMessage(Colleague colleague, String message);
    }

    2.创建具体中介者,包含进行交互的同事对象。

    public class ConcreteMediator implements Mediator{
        protected Colleague colleague1;
        protected Colleague colleague2;
    ​
        @Override
        public void sendMessage(Colleague colleague, String message) {
            if (colleague == colleague1){
                colleague2.receiveMessage(message);
            } else if (colleague == colleague2) {
                colleague1.receiveMessage(message);
            }
        }
    ​
        public void setColleague1(Colleague colleague1) {
            this.colleague1 = colleague1;
        }
    ​
        public void setColleague2(Colleague colleague2) {
            this.colleague2 = colleague2;
        }
    }

    3.创建抽象同事类,包含中介者引用。

    public abstract class Colleague {
        protected Mediator mediator;
    ​
        public Colleague(Mediator mediator){
            this.mediator = mediator;
        }
    ​
        public abstract void sendMessage(String message);
        public abstract void receiveMessage(String message);
    }

    4.创建具体同事类。

    public class ConcreteColleague1 extends Colleague{
        public ConcreteColleague1(Mediator mediator) {
            super(mediator);
        }
    ​
        @Override
        public void sendMessage(String message) {
            mediator.sendMessage(this,message);
        }
    ​
        @Override
        public void receiveMessage(String message) {
            System.out.println("colleague1 received message:" + message);
        }
    }
    public class ConcreteColleague2 extends Colleague{
        public ConcreteColleague2(Mediator mediator) {
            super(mediator);
        }
    ​
        @Override
        public void sendMessage(String message) {
            mediator.sendMessage(this,message);
        }
    ​
        @Override
        public void receiveMessage(String message) {
            System.out.println("colleague2 received message:" + message);
        }
    }

    5.客户端代码

    public class MediatorClient {
        public static void main(String[] args) {
            ConcreteMediator mediator = new ConcreteMediator();
            ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
            ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
    ​
            mediator.setColleague1(concreteColleague1);
            mediator.setColleague2(concreteColleague2);
    ​
            concreteColleague1.sendMessage("Hello from colleague1 ...");
            concreteColleague2.sendMessage("Hi from colleague2 ...");
        }
    }

    应用场景

    1. 当多个对象之间存在复杂的相互依赖关系,而且这些对象之间的交互关系难以维护时,可以考虑使用中介者模式来简化交互。

    2. 当一个对象的改变需要影响其他多个对象的状态或行为时,中介者模式可以用于协调这些对象的交互。

    3. 当对象之间的通信方式需要松散耦合,以便可以轻松添加或修改对象时,中介者模式非常有用。

    本质

            中介者模式的本质是将对象之间的通信集中在一个中介者对象中,以减少对象之间的直接依赖关系,实现松散耦合。

    设计原则

    单一职责原则(Single Responsibility Principle):中介者模式有助于将对象的职责分离,每个对象专注于自己的任务,而不需要关心其他对象的详细实现。

    相关设计模式

    • 中介者模式通常与观察者模式(Observer Pattern)结合使用,观察者模式用于实现同事对象和中介者之间的通信。此外,中介者模式也可以与单例模式(Singleton Pattern)结合使用,以确保中介者对象的单一性。

    开源框架中的应用

    1. 聊天应用程序:在一个多人聊天应用程序中,各个聊天参与者可以是同事对象,而聊天室可以作为中介者,负责协调消息的传递。

    2. 图形用户界面(GUI)库:GUI库中的窗口、按钮、文本框等组件可以是同事对象,而窗口管理器可以作为中介者,协调组件之间的事件处理。

    3. 航空交通管制系统:航空交通管制系统中的飞机、塔台等可以是同事对象,而空中交通控制中心可以作为中介者,协调飞机的飞行和降落。

    4. Spring框架 - 事件通知:Spring框架中的事件通知机制可以看作是一种中介者模式,其中事件发布者和事件监听者之间的通信由Spring框架负责管理。

  • 相关阅读:
    [MT8766][Android12] 取消WIFI热点超过10分钟没有连接自动关闭设定
    LeetCode50天刷题计划(Day 43 —子集(20)单词搜索(40)
    scipy optimze求解矩阵
    高数_第3章重积分_在极坐标下计算二重积分之2
    最新Next 14快速上手基础部分
    机器学习概论
    堆排序的筛选方法建立的初始堆
    二分查找一看就会,一写就废?
    分布式、锁、延时任务
    FPGA 学习笔记:IP Clocking Wizard 的基本操作
  • 原文地址:https://blog.csdn.net/Elaine2391/article/details/132973406