中介者模式

Post on Oct 08, 2021 by Wei Lin

介绍

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过封装一组对象之间的交互方式,来减少对象之间的直接依赖关系。中介者模式通过引入一个中介者对象,将对象之间的通信转变为与中介者对象的交互,从而使得对象之间的耦合度降低,系统更加灵活和可扩展。


中介者模式的核心思想是,将对象之间的通信集中在一个中介者对象中,由中介者对象负责协调和控制对象之间的交互。对象之间不再直接交互,而是通过中介者对象进行通信。这样,当一个对象发生改变时,只需通知中介者对象,由中介者对象负责将这个改变通知给其他相关的对象。

模式角色

(1) 中介者(Mediator)

定义了对象之间通信的接口,负责协调和控制对象之间的交互。通常包含注册、转发消息等方法。


(2) 具体中介者(Concrete Mediator)

实现中介者接口,负责具体的协调和控制对象之间的交互。它需要了解并维护各个对象的引用。


(3) 同事类(Colleague)

定义了对象之间通信的接口,通常包含发送消息和接收消息的方法。每个同事类需要持有一个中介者对象的引用。


(4) 具体同事类(Concrete Colleague)

实现同事类接口,负责具体的通信操作。当需要与其他对象进行通信时,将消息发送给中介者对象进行处理。

中介者模式.png

代码示例

package com.behavioral;

import java.util.ArrayList;
import java.util.List;

/**
 * 具体同事类持有具体中介者的引用
 * 当需要与其他对象进行通信时,将消息发送给中介者对象进行处理
 */
public class MediatorPattern {
    public static void main(String[] args) {
        // 创建中介者对象
        Mediator mediator = new ConcreteMediator();

        // 创建同事对象
        Colleague colleague1 = new ConcreteColleague("Colleague1", mediator);
        Colleague colleague2 = new ConcreteColleague("Colleague2", mediator);
        Colleague colleague3 = new ConcreteColleague("Colleague3", mediator);

        // 将同事对象添加到中介者中
        ((ConcreteMediator) mediator).addColleague(colleague1);
        ((ConcreteMediator) mediator).addColleague(colleague2);
        ((ConcreteMediator) mediator).addColleague(colleague3);

        // 同事对象发送消息
        colleague1.sendMessage("Hello, colleagues!");
    }
}

/**
 * 中介者接口(Mediator),用于定义对象之间的通信方法
 */
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

/**
 * 具体中介者类(ConcreteMediator),实现中介者接口,并维护一组同事对象的引用
 */
class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues;

    public ConcreteMediator() {
        colleagues = new ArrayList<>();
    }

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            if (c != colleague) {
                c.receiveMessage(message);
            }
        }
    }
}

/**
 * 同事类接口(Colleague),用于定义同事类的通信方法
 */
interface Colleague {
    void sendMessage(String message);

    void receiveMessage(String message);
}

/**
 * 具体的同事类(ConcreteColleague),实现同事类接口,并在需要发送消息时通过中介者来发送消息
 */
class ConcreteColleague implements Colleague {
    private String Name;
    private Mediator mediator;

    public ConcreteColleague(String name, Mediator mediator) {
        this.Name = name;
        this.mediator = mediator;
    }

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println(Name + " Received message: " + message);
    }
}

应用场景

中介者模式通过引入中介者对象来简化对象之间的通信,提高系统的灵活性和可维护性,适用于以下场景。


(1) 对象之间存在复杂的通信方式

当对象之间存在复杂的通信方式,需要多对多的交互和协作时,可以使用中介者模式。中介者模式可以将复杂的交互逻辑封装在中介者对象中,简化对象之间的通信方式。


(2) 对象之间的依赖关系较为复杂

当对象之间的依赖关系较为复杂,导致对象之间的耦合度较高时,可以使用中介者模式。中介者模式可以减少对象之间的直接依赖关系,通过引入中介者对象来协调和控制对象之间的交互。


(3) 需要集中管理对象之间的交互逻辑

当需要集中管理对象之间的交互逻辑,避免逻辑分散在各个对象中时,可以使用中介者模式。中介者模式将对象之间的通信逻辑集中在中介者对象中,统一管理和协调对象之间的交互。


(4) 需要灵活地扩展和修改对象之间的交互方式

当需要灵活地添加新的对象或修改对象之间的交互方式时,可以使用中介者模式。中介者模式的设计可以轻松地添加新的同事类或修改中介者对象的行为,而不需要修改已有的对象类。


(5) 需要解耦对象之间的通信关系

当需要减少对象之间的直接依赖关系,将对象解耦,提高系统的灵活性和可维护性时,可以使用中介者模式。中介者模式将对象之间的通信通过中介者对象进行间接的交互,从而降低了对象之间的耦合度。

优缺点

(1) 中介者模式的优点

  • 减少了对象之间的直接依赖关系:中介者模式通过引入中介者对象,将对象之间的通信转变为与中介者对象的交互,从而减少了对象之间的直接依赖关系。对象只需要和中介者对象进行通信,而不需要了解其他对象的具体实现。

  • 简化了对象之间的通信:中介者模式将对象之间的通信集中在中介者对象中,由中介者对象负责协调和控制对象之间的交互。这样可以简化对象之间的通信方式,减少了对象之间的复杂交互逻辑。

  • 提高了系统的灵活性和可扩展性:中介者模式可以通过扩展中介者对象和添加新的同事类来增加系统的灵活性和可扩展性。新的同事类可以轻松地加入到系统中,而不需要修改已有的对象类。

  • 解耦了对象之间的通信关系:中介者模式将对象之间的通信通过中介者对象进行间接的交互,从而降低了对象之间的耦合度。对象只需要与中介者对象进行通信,而无需直接了解其他对象的存在。

(2) 中介者模式的缺点

  • 中介者对象可能会变得复杂:随着系统的复杂性增加,中介者对象可能会变得复杂,承担了过多的责任。这可能导致中介者对象的维护和管理变得困难。

  • 中介者对象成为系统中的单点故障:中介者对象负责协调和控制对象之间的交互,如果中介者对象出现故障或无法正常工作,可能会影响整个系统的稳定性。

  • 增加了系统的复杂性:引入中介者模式会增加系统的复杂性,特别是在系统中存在大量的对象和复杂的交互关系时。过度使用中介者模式可能会导致系统的维护和理解变得困难。