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

目录

中介者模式定义

优点

缺点

结构说明

工作流程

代码练习

应用场景

本质

设计原则

相关设计模式

开源框架中的应用


中介者模式定义

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

聊聊设计模式——中介者模式_第1张图片

优点

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

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

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

缺点

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

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

结构说明

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

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

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

工作流程

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

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

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

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

代码练习

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

聊聊设计模式——中介者模式_第2张图片

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框架负责管理。

你可能感兴趣的:(设计模式,设计模式,中介者模式,java)