中介者模式


目录

  1. 中介者模式简介

  2. 中介者模式的意图

  3. 中介者模式的结构

  4. 中介者模式的实现

  5. 中介者模式的适用场景

  6. 中介者模式的优缺点

  7. 中介者模式的常见误区与解决方案

  8. 中介者模式的实际应用实例

  9. 中介者模式与其他模式的比较

  10. 总结

  11. 参考资料


1. 中介者模式简介

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介对象来封装一系列对象的交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互。该模式的核心思想是引入一个中介者对象来管理对象之间的通信,避免对象之间的直接依赖。

关键点:

  • 集中管理:所有对象的交互都通过中介者进行,集中管理对象之间的通信。

  • 降低耦合度:对象无需直接引用其他对象,降低了系统的耦合度。

  • 增强灵活性:通过修改中介者,可以轻松改变对象之间的交互方式,而无需修改各个对象。


2. 中介者模式的意图

中介者模式的主要目的是:

  • 封装对象之间的交互:通过中介者对象集中管理和协调多个对象之间的交互。

  • 降低对象之间的耦合度:对象不需要知道其他对象的具体信息,只需要与中介者通信。

  • 简化对象间的依赖关系:避免对象之间形成复杂的网状结构,使系统更易于理解和维护。

  • 提高系统的灵活性和可扩展性:通过更改中介者的实现,可以轻松调整对象之间的交互逻辑,而无需修改对象本身。


3. 中介者模式的结构

3.1. 结构组成

中介者模式主要由以下四个角色组成:

  1. Mediator(中介者接口):定义了一个接口,用于与各同事类通信。

  2. ConcreteMediator(具体中介者):实现了Mediator接口,协调各同事类之间的交互。

  3. Colleague(同事类):每个同事类都持有对中介者的引用,通过中介者与其他同事类通信。

  4. Client(客户端):创建具体中介者和同事类对象,并设置它们之间的关系。

角色关系:

  • Client 创建并初始化 ConcreteMediatorColleague 对象,设置它们之间的关系。

  • ConcreteMediator 维护并协调 Colleague 之间的交互。

  • Colleague 通过中介者接口与其他同事类进行通信,而不直接引用它们。

3.2. UML类图

以下是中介者模式的简化UML类图:

        +------------------------+
        |     Client             |
        +------------------------+
        | - mediator: Mediator   |
        | - colleague1: Colleague|
        | - colleague2: Colleague|
        | + main()               |
        +------------------------+
                |  创建
                v
        +-----------------------------------------------+
        |    Mediator                                   |
        +-----------------------------------------------+
        | + notify(colleague: Colleague, event: String) |
        +-----------------------------------------------+
                ^
                |
        +----------------------------+
        | ConcreteMediator           |
        +----------------------------+
        | - colleague1: Colleague    |
        | - colleague2: Colleague    |
        +----------------------------+
        | + notify(colleague, event) |
        +----------------------------+
                /_\
                 |
    +---------------------+      +---------------------+
    |    Colleague        |      |     Colleague       |
    +---------------------+      +---------------------+
    | - mediator: Mediator|      | - mediator: Mediator|
    +---------------------+      +---------------------+
    | + send(message)     |      | + send(message)     |
    | + receive(message)  |      | + receive(message)  |
    +---------------------+      +---------------------+

说明:

  • Client 创建了具体的同事类和中介者,并将同事类注册到中介者中。

  • ConcreteMediator 持有对同事类的引用,并在接收到同事类的消息时,协调其他同事类的响应。

  • Colleague 通过中介者发送和接收消息,而不直接与其他同事类交互。


4. 中介者模式的实现

以下示例将展示如何在Java和Python中实现中介者模式。以一个简单的聊天室系统为例,实现用户之间的消息传递通过中介者来协调。

4.1. Java 实现示例

示例说明

我们将实现一个简单的聊天室系统,其中中介者负责协调用户之间的消息传递,用户无需直接与其他用户通信。

代码实现

// Mediator接口
public interface Mediator {
    void sendMessage(String message, Colleague colleague);
    void addColleague(Colleague colleague);
}

// ConcreteMediator类
import java.util.ArrayList;
import java.util.List;

public class ChatMediator implements Mediator {
    private List<Colleague> colleagues;

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

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

    @Override
    public void sendMessage(String message, Colleague sender){
        for(Colleague colleague : colleagues){
            // 不发送给自己
            if(colleague != sender){
                colleague.receive(message);
            }
        }
    }
}

// Colleague抽象类
public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator){
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// ConcreteColleague类
public class User extends Colleague {
    private String name;

    public User(Mediator mediator, String name){
        super(mediator);
        this.name = name;
        mediator.addColleague(this);
    }

    @Override
    public void send(String message){
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message){
        System.out.println(this.name + " 接收到消息: " + message);
    }
}

// 客户端代码
public class MediatorPatternDemo {
    public static void main(String[] args) {
        Mediator mediator = new ChatMediator();

        Colleague user1 = new User(mediator, "Alice");
        Colleague user2 = new User(mediator, "Bob");
        Colleague user3 = new User(mediator, "Charlie");

        user1.send("大家好!");
        System.out.println();
        user2.send("你好,Alice!");
        System.out.println();
        user3.send("大家晚上好!");
    }
}

输出

Alice 发送消息: 大家好!
Bob 接收到消息: 大家好!
Charlie 接收到消息: 大家好!

Bob 发送消息: 你好,Alice!
Alice 接收到消息: 你好,Alice!
Charlie 接收到消息: 你好,Alice!

Charlie 发送消息: 大家晚上好!
Alice 接收到消息: 大家晚上好!
Bob 接收到消息: 大家晚上好!

代码说明

  • Mediator接口:定义了发送消息和添加同事的方法。

  • ChatMediator类:实现了Mediator接口,维护了一个同事列表,并负责协调消息的发送。

  • Colleague抽象类:定义了发送和接收消息的接口,并持有对Mediator的引用。

  • User类:具体的同事类,实现了发送和接收消息的逻辑。

  • MediatorPatternDemo类:客户端,创建了中介者和用户对象,并模拟了用户之间的消息传递。

4.2. Python 实现示例

示例说明

同样,实现一个简单的聊天室系统,用户通过中介者发送和接收消息。

代码实现

from abc import ABC, abstractmethod

# Mediator接口
class Mediator(ABC):
    @abstractmethod
    def send_message(self, message: str, colleague):
        pass

    @abstractmethod
    def add_colleague(self, colleague):
        pass

# ConcreteMediator类
class ChatMediator(Mediator):
    def __init__(self):
        self.colleagues = []

    def add_colleague(self, colleague):
        self.colleagues.append(colleague)

    def send_message(self, message: str, sender):
        for colleague in self.colleagues:
            if colleague != sender:
                colleague.receive(message)

# Colleague抽象类
class Colleague(ABC):
    def __init__(self, mediator: Mediator):
        self.mediator = mediator
        self.mediator.add_colleague(self)

    @abstractmethod
    def send(self, message: str):
        pass

    @abstractmethod
    def receive(self, message: str):
        pass

# ConcreteColleague类
class User(Colleague):
    def __init__(self, mediator: Mediator, name: str):
        super().__init__(mediator)
        self.name = name

    def send(self, message: str):
        print(f"{self.name} 发送消息: {message}")
        self.mediator.send_message(message, self)

    def receive(self, message: str):
        print(f"{self.name} 接收到消息: {message}")

# 客户端代码
def mediator_pattern_demo():
    mediator = ChatMediator()

    user1 = User(mediator, "Alice")
    user2 = User(mediator, "Bob")
    user3 = User(mediator, "Charlie")

    user1.send("大家好!")
    print()
    user2.send("你好,Alice!")
    print()
    user3.send("大家晚上好!")

if __name__ == "__main__":
    mediator_pattern_demo()

输出

Alice 发送消息: 大家好!
Bob 接收到消息: 大家好!
Charlie 接收到消息: 大家好!

Bob 发送消息: 你好,Alice!
Alice 接收到消息: 你好,Alice!
Charlie 接收到消息: 你好,Alice!

Charlie 发送消息: 大家晚上好!
Alice 接收到消息: 大家晚上好!
Bob 接收到消息: 大家晚上好!

代码说明

  • Mediator抽象类:定义了发送消息和添加同事的方法。

  • ChatMediator类:实现了Mediator接口,维护了一个同事列表,并负责协调消息的发送。

  • Colleague抽象类:定义了发送和接收消息的接口,并持有对Mediator的引用。

  • User类:具体的同事类,实现了发送和接收消息的逻辑。

  • mediator_pattern_demo函数:客户端,创建了中介者和用户对象,并模拟了用户之间的消息传递。


5. 中介者模式的适用场景

中介者模式适用于以下场景:

  1. 对象之间存在复杂的交互关系:当多个对象之间存在复杂的交互和依赖关系时,中介者模式可以通过引入中介者来简化这些交互。

  2. 需要集中控制对象之间的通信:通过中介者对象集中管理和协调对象之间的通信,便于维护和管理。

  3. 希望降低系统的耦合度:对象通过中介者进行通信,避免了对象之间的直接引用,降低了系统的耦合度。

  4. 需要动态地改变对象之间的交互:通过修改中介者的实现,可以灵活地调整对象之间的交互方式,而无需修改各个对象。

  5. 系统中有大量的对象相互协作:中介者模式可以减少对象之间的直接依赖,避免系统中出现对象间的网状依赖结构。

示例应用场景:

  • 图形用户界面(GUI)系统:窗口中的各个组件(按钮、文本框、标签等)通过中介者进行交互,避免组件之间的直接依赖。

  • 多人聊天室系统:用户通过中介者(聊天室)发送和接收消息,避免用户之间的直接通信。

  • 航空交通控制系统:各个飞行器通过中介者(控制塔)进行通信和协调,避免飞行器之间的直接通信。

  • 电子商务系统中的订单处理:各个模块(库存、支付、物流等)通过中介者进行协调,避免模块之间的直接依赖。

  • 智能家居系统:各种设备通过中介者(中央控制器)进行通信和控制,避免设备之间的直接通信。


6. 中介者模式的优缺点

6.1. 优点

  1. 降低系统的耦合度:通过引入中介者,系统中的各个对象不需要直接相互引用,减少了对象之间的依赖关系。

  2. 简化对象间的通信:所有对象的交互都通过中介者进行,避免了对象之间形成复杂的网状结构。

  3. 集中管理:中介者对象负责协调和管理对象之间的交互,便于维护和管理。

  4. 增强系统的灵活性和可扩展性:通过修改中介者的实现,可以轻松改变对象之间的交互方式,而无需修改各个对象。

  5. 提高复用性:通过中介者,可以复用已有的对象,而无需了解它们的内部实现。

6.2. 缺点

  1. 中介者可能过于复杂:随着系统规模的扩大,中介者可能会变得非常复杂,承担过多的职责,导致单一职责原则被破坏。

  2. 中介者成为系统的核心:系统的所有交互都依赖于中介者,如果中介者出现问题,可能会影响整个系统的运行。

  3. 增加系统的维护成本:中介者负责协调对象之间的交互,随着对象数量的增加,中介者的逻辑也会变得复杂,增加了维护成本。

  4. 可能违反开闭原则:中介者需要频繁修改以适应对象之间的新交互,可能导致违反开闭原则(对扩展开放,对修改封闭)。


7. 中介者模式的常见误区与解决方案

7.1. 误区1:将所有对象的交互都通过中介者处理

问题描述: 开发者可能倾向于将系统中所有对象的交互都通过中介者来处理,导致中介者承担过多的职责,变得过于复杂。

解决方案:

  • 明确职责边界:仅将对象之间的关键交互通过中介者处理,对于简单的交互,允许对象之间直接通信。

  • 分层中介者:如果系统中存在多个不同的交互场景,可以引入多个中介者,每个中介者负责特定的交互逻辑,避免单一中介者过于庞大。

  • 遵循单一职责原则:确保中介者只负责协调对象之间的交互,而不承担其他业务逻辑。

7.2. 误区2:中介者直接处理业务逻辑

问题描述: 中介者不仅协调对象之间的通信,还直接处理业务逻辑,导致中介者与具体的业务耦合。

解决方案:

  • 保持中介者的中立性:中介者只负责协调对象之间的交互,不直接处理业务逻辑。业务逻辑应由各个对象自身或其他专门的类来处理。

  • 使用职责分离:将业务逻辑与通信协调分离,确保中介者仅承担通信协调的职责。

7.3. 误区3:忽视中介者的可扩展性

问题描述: 在设计中介者时未考虑到未来可能的扩展需求,导致中介者难以适应新的交互场景。

解决方案:

  • 设计灵活的接口:确保中介者接口具有足够的灵活性,以支持不同类型的交互请求。

  • 模块化设计:将中介者设计为模块化的组件,便于在需要时进行扩展和修改。

  • 使用设计原则:遵循开闭原则,确保在不修改中介者核心代码的情况下,能够通过扩展类或接口来支持新的交互场景。


8. 中介者模式的实际应用实例

8.1. 聊天室系统

示例说明

实现一个简单的聊天室系统,用户通过中介者发送和接收消息,避免用户之间的直接通信。

Java实现

// Mediator接口
public interface Mediator {
    void sendMessage(String message, User colleague);
    void addUser(User user);
}

// ConcreteMediator类
import java.util.ArrayList;
import java.util.List;

public class ChatRoom implements Mediator {
    private List<User> users;

    public ChatRoom(){
        users = new ArrayList<>();
    }

    @Override
    public void addUser(User user){
        users.add(user);
    }

    @Override
    public void sendMessage(String message, User sender){
        for(User user : users){
            if(user != sender){
                user.receive(message);
            }
        }
    }
}

// Colleague类
public abstract class User {
    protected Mediator mediator;
    protected String name;

    public User(Mediator mediator, String name){
        this.mediator = mediator;
        this.name = name;
        mediator.addUser(this);
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// ConcreteColleague类
public class ChatUser extends User {
    public ChatUser(Mediator mediator, String name){
        super(mediator, name);
    }

    @Override
    public void send(String message){
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message){
        System.out.println(this.name + " 接收到消息: " + message);
    }
}

// 客户端代码
public class MediatorPatternDemo {
    public static void main(String[] args) {
        Mediator chatRoom = new ChatRoom();

        User user1 = new ChatUser(chatRoom, "Alice");
        User user2 = new ChatUser(chatRoom, "Bob");
        User user3 = new ChatUser(chatRoom, "Charlie");

        user1.send("大家好!");
        System.out.println();
        user2.send("你好,Alice!");
        System.out.println();
        user3.send("大家晚上好!");
    }
}

输出

Alice 发送消息: 大家好!
Bob 接收到消息: 大家好!
Charlie 接收到消息: 大家好!

Bob 发送消息: 你好,Alice!
Alice 接收到消息: 你好,Alice!
Charlie 接收到消息: 你好,Alice!

Charlie 发送消息: 大家晚上好!
Alice 接收到消息: 大家晚上好!
Bob 接收到消息: 大家晚上好!

代码说明

  • Mediator接口:定义了发送消息和添加用户的方法。

  • ChatRoom类:实现了Mediator接口,维护了一个用户列表,并负责协调消息的发送。

  • User抽象类:定义了发送和接收消息的接口,并持有对Mediator的引用。

  • ChatUser类:具体的用户类,实现了发送和接收消息的逻辑。

  • MediatorPatternDemo类:客户端,创建了中介者和用户对象,并模拟了用户之间的消息传递。

8.2. GUI组件管理

示例说明

在图形用户界面(GUI)系统中,窗口中的各个组件(如按钮、文本框、标签等)通过中介者进行交互。例如,当一个按钮被点击时,中介者可以协调其他组件的响应,如更新文本框的内容或改变标签的显示。

Python实现

from abc import ABC, abstractmethod

# Mediator接口
class Mediator(ABC):
    @abstractmethod
    def notify(self, sender, event):
        pass

# ConcreteMediator类
class GUIChatMediator(Mediator):
    def __init__(self):
        self.button = None
        self.textbox = None
        self.label = None

    def set_button(self, button):
        self.button = button

    def set_textbox(self, textbox):
        self.textbox = textbox

    def set_label(self, label):
        self.label = label

    def notify(self, sender, event):
        if sender == self.button and event == "click":
            message = self.textbox.get_text()
            self.label.set_text(f"按钮点击,文本框内容: {message}")

# Colleague类
class GUIComponent(ABC):
    def __init__(self, mediator: Mediator):
        self.mediator = mediator

class Button(GUIComponent):
    def click(self):
        print("按钮被点击")
        self.mediator.notify(self, "click")

class TextBox(GUIComponent):
    def __init__(self, mediator: Mediator, text: str = ""):
        super().__init__(mediator)
        self.text = text

    def set_text(self, text: str):
        self.text = text

    def get_text(self) -> str:
        return self.text

class Label(GUIComponent):
    def __init__(self, mediator: Mediator):
        super().__init__(mediator)
        self.text = ""

    def set_text(self, text: str):
        self.text = text
        print(f"标签显示: {self.text}")

# 客户端代码
def mediator_pattern_demo():
    mediator = GUIChatMediator()

    button = Button(mediator)
    textbox = TextBox(mediator, "Hello, Mediator!")
    label = Label(mediator)

    mediator.set_button(button)
    mediator.set_textbox(textbox)
    mediator.set_label(label)

    # 模拟用户输入
    textbox.set_text("Mediator模式示例")

    # 用户点击按钮
    button.click()

if __name__ == "__main__":
    mediator_pattern_demo()

输出

标签显示: 按钮点击,文本框内容: Mediator模式示例
按钮被点击

代码说明

  • Mediator抽象类:定义了通知方法notify(),用于接收同事类的事件通知。

  • GUIChatMediator类:实现了Mediator接口,持有各个组件的引用,并在收到事件通知时协调组件的响应。

  • GUIComponent抽象类:定义了组件基类,持有对Mediator的引用。

  • Button类:具体的按钮组件,模拟点击事件,并通知中介者。

  • TextBox类:具体的文本框组件,提供设置和获取文本的方法。

  • Label类:具体的标签组件,提供设置文本的方法,并在设置文本时输出显示内容。

  • mediator_pattern_demo函数:客户端,创建了中介者和各个组件对象,设置它们之间的关系,并模拟用户输入和按钮点击事件。

8.3. 航空交通控制系统

示例说明

在航空交通控制系统中,飞行器需要与控制塔进行通信,以获取起降许可和航线指令。通过中介者模式,可以实现飞行器与控制塔之间的解耦,所有通信通过中介者(控制塔)进行协调。

Java实现

// Mediator接口
public interface Mediator {
    void registerAirplane(Airplane airplane);
    void sendMessage(String message, Airplane airplane);
}

// ConcreteMediator类
import java.util.ArrayList;
import java.util.List;

public class AirTrafficControl implements Mediator {
    private List<Airplane> airplanes;

    public AirTrafficControl(){
        airplanes = new ArrayList<>();
    }

    @Override
    public void registerAirplane(Airplane airplane){
        airplanes.add(airplane);
    }

    @Override
    public void sendMessage(String message, Airplane sender){
        System.out.println("控制塔接收到来自 " + sender.getName() + " 的消息: " + message);
        for(Airplane airplane : airplanes){
            if(airplane != sender){
                airplane.receive(message);
            }
        }
    }
}

// Colleague类
public abstract class Airplane {
    protected Mediator mediator;
    protected String name;

    public Airplane(Mediator mediator, String name){
        this.mediator = mediator;
        this.name = name;
        mediator.registerAirplane(this);
    }

    public abstract void send(String message);
    public abstract void receive(String message);

    public String getName(){
        return this.name;
    }
}

// ConcreteColleague类
public class CommercialAirplane extends Airplane {
    public CommercialAirplane(Mediator mediator, String name){
        super(mediator, name);
    }

    @Override
    public void send(String message){
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message){
        System.out.println(this.name + " 接收到消息: " + message);
    }
}

// 客户端代码
public class MediatorPatternDemo {
    public static void main(String[] args) {
        Mediator mediator = new AirTrafficControl();

        Airplane plane1 = new CommercialAirplane(mediator, "航班A");
        Airplane plane2 = new CommercialAirplane(mediator, "航班B");
        Airplane plane3 = new CommercialAirplane(mediator, "航班C");

        plane1.send("请求起飞许可");
        System.out.println();
        plane2.send("请求降落许可");
        System.out.println();
        plane3.send("报告当前位置");
    }
}

输出

航班A 发送消息: 请求起飞许可
控制塔接收到来自 航班A 的消息: 请求起飞许可
航班B 接收到消息: 请求起飞许可
航班C 接收到消息: 请求起飞许可

航班B 发送消息: 请求降落许可
控制塔接收到来自 航班B 的消息: 请求降落许可
航班A 接收到消息: 请求降落许可
航班C 接收到消息: 请求降落许可

航班C 发送消息: 报告当前位置
控制塔接收到来自 航班C 的消息: 报告当前位置
航班A 接收到消息: 报告当前位置
航班B 接收到消息: 报告当前位置

代码说明

  • Mediator接口:定义了注册飞行器和发送消息的方法。

  • AirTrafficControl类:实现了Mediator接口,维护了一个飞行器列表,并负责协调消息的发送。

  • Airplane抽象类:定义了发送和接收消息的接口,并持有对Mediator的引用和名称。

  • CommercialAirplane类:具体的飞行器类,实现了发送和接收消息的逻辑。

  • MediatorPatternDemo类:客户端,创建了中介者和飞行器对象,并模拟了飞行器之间的消息传递。

8.4. 电子商务系统中的订单处理

示例说明

在电子商务系统中,订单处理涉及多个模块,如库存管理、支付处理、物流配送等。通过中介者模式,可以实现这些模块之间的解耦,所有订单相关的操作通过中介者进行协调。

Python实现

from abc import ABC, abstractmethod

# Mediator接口
class Mediator(ABC):
    @abstractmethod
    def notify(self, sender, event):
        pass

# ConcreteMediator类
class OrderMediator(Mediator):
    def __init__(self):
        self.inventory = None
        self.payment = None
        self.shipping = None

    def set_inventory(self, inventory):
        self.inventory = inventory

    def set_payment(self, payment):
        self.payment = payment

    def set_shipping(self, shipping):
        self.shipping = shipping

    def notify(self, sender, event):
        if sender == self.inventory and event == "in_stock":
            self.payment.process_payment()
        elif sender == self.payment and event == "payment_done":
            self.shipping.ship_order()
        elif sender == self.inventory and event == "out_of_stock":
            print("商品缺货,无法完成订单。")

# Colleague类
class Inventory:
    def __init__(self, mediator: Mediator):
        self.mediator = mediator
        self.mediator.set_inventory(self)

    def check_stock(self, product: str):
        # 简单模拟库存检查
        if product == "Laptop":
            print(f"{product} 有库存。")
            self.mediator.notify(self, "in_stock")
        else:
            print(f"{product} 缺货。")
            self.mediator.notify(self, "out_of_stock")

class Payment:
    def __init__(self, mediator: Mediator):
        self.mediator = mediator
        self.mediator.set_payment(self)

    def process_payment(self):
        print("支付已完成。")
        self.mediator.notify(self, "payment_done")

class Shipping:
    def __init__(self, mediator: Mediator):
        self.mediator = mediator
        self.mediator.set_shipping(self)

    def ship_order(self):
        print("订单已发货。")

# 客户端代码
def mediator_pattern_demo():
    mediator = OrderMediator()

    inventory = Inventory(mediator)
    payment = Payment(mediator)
    shipping = Shipping(mediator)

    # 客户端发起订单处理
    print("客户下单购买 Laptop:")
    inventory.check_stock("Laptop")
    print("\n客户下单购买 Phone:")
    inventory.check_stock("Phone")

if __name__ == "__main__":
    mediator_pattern_demo()

输出

客户下单购买 Laptop:
Laptop 有库存。
支付已完成。
订单已发货。

客户下单购买 Phone:
Phone 缺货。
商品缺货,无法完成订单。

代码说明

  • Mediator抽象类:定义了通知方法notify(),用于接收同事类的事件通知。

  • OrderMediator类:实现了Mediator接口,持有库存、支付和物流模块的引用,并协调它们之间的交互。

  • Inventory类:库存管理模块,检查商品库存并通知中介者。

  • Payment类:支付处理模块,处理支付并通知中介者。

  • Shipping类:物流配送模块,处理订单发货。

  • mediator_pattern_demo函数:客户端,创建了中介者和各个模块对象,并模拟了客户下单的过程。


9. 中介者模式与其他模式的比较

9.1. 中介者模式 vs. 观察者模式

  • 中介者模式用于集中管理对象之间的交互,通过中介者对象协调多个对象的通信。

  • 观察者模式用于建立一对多的依赖关系,当一个对象状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。

关键区别:

  • 目的不同:中介者模式关注对象之间的协调和交互,观察者模式关注对象状态的同步和通知。

  • 结构不同:中介者模式引入中介者对象作为通信中心,观察者模式建立观察者和被观察者之间的直接关系。

  • 耦合度:中介者模式通过中介者降低了对象之间的直接耦合,观察者模式对象之间仍然存在一定的耦合。

9.2. 中介者模式 vs. 责任链模式

  • 中介者模式用于集中管理对象之间的交互,通过中介者对象协调多个对象的通信。

  • 责任链模式用于将请求沿着一条链传递,直到有一个对象处理请求。

关键区别:

  • 目的不同:中介者模式关注对象之间的协调与通信,责任链模式关注请求的处理流程。

  • 结构不同:中介者模式引入一个中介者对象作为通信中心,责任链模式建立处理者链条,依次处理请求。

  • 使用场景:中介者模式适用于复杂的对象交互场景,责任链模式适用于需要动态决定请求处理者的场景。

9.3. 中介者模式 vs. 装饰者模式

  • 中介者模式用于集中管理对象之间的交互,通过中介者对象协调多个对象的通信。

  • 装饰者模式用于动态地为对象添加新功能,通过装饰者对象包装原有对象,增强其功能。

关键区别:

  • 目的不同:中介者模式关注对象之间的交互与协调,装饰者模式关注对象功能的扩展与增强。

  • 结构不同:中介者模式引入中介者对象作为通信中心,装饰者模式通过继承或组合实现功能增强。

  • 使用场景:中介者模式适用于复杂对象交互场景,装饰者模式适用于需要动态添加对象功能的场景。

9.4. 中介者模式 vs. 访问者模式

  • 中介者模式用于集中管理对象之间的交互,通过中介者对象协调多个对象的通信。

  • 访问者模式用于分离数据结构与数据操作,通过访问者对象遍历数据结构并执行操作。

关键区别:

  • 目的不同:中介者模式关注对象之间的通信与协调,访问者模式关注对对象结构的遍历和操作。

  • 结构不同:中介者模式引入中介者对象作为通信中心,访问者模式引入访问者接口和具体访问者类,通过双向调用实现操作。

  • 使用场景:中介者模式适用于复杂对象交互场景,访问者模式适用于需要对对象结构执行多种操作的场景。


10. 总结

**中介者模式(Mediator Pattern)**通过引入一个中介者对象来集中管理和协调多个对象之间的交互,降低了对象之间的直接耦合,增强了系统的灵活性和可扩展性。该模式适用于对象之间存在复杂交互关系、需要集中管理通信流程的场景,尤其在需要动态调整对象间交互逻辑时,中介者模式提供了有效的解决方案。

关键学习点回顾:

  1. 理解中介者模式的核心概念:通过中介者对象集中管理和协调多个对象之间的交互,降低了对象之间的直接耦合。

  2. 掌握中介者模式的结构:包括Mediator接口、ConcreteMediator、Colleague抽象类、ConcreteColleague和Client之间的关系。

  3. 识别适用的应用场景:对象之间存在复杂交互关系、需要集中管理通信流程、希望降低系统耦合度等。

  4. 认识中介者模式的优缺点:降低耦合度、简化通信、增强灵活性和可扩展性;但可能导致中介者过于复杂、成为系统的核心、增加维护成本等。

  5. 理解常见误区及解决方案:避免中介者承担过多职责、保持中介者的中立性、确保中介者的可扩展性等。

  6. 实际应用中的中介者模式实例:聊天室系统、GUI组件管理、航空交通控制系统、电子商务系统中的订单处理等。


11. 参考资料