2023-7-14-第十九式中介者模式

简介: 2023-7-14-第十九式中介者模式

😉一、基础概念

中介者模式(Mediator Pattern)是一种行为型设计模式,用于解耦多个对象之间的复杂交互和通信。在中介者模式中,多个对象不直接相互通信,而是通过一个中介者对象进行通信。

中介者模式的核心思想是将对象之间的交互逻辑封装到中介者对象中,从而使得各个对象之间的关系变得松散。这样一来,每个对象只需要与中介者进行交互,而无需了解其他对象的存在和细节,从而简化了对象之间的耦合关系。

在中介者模式中,通常会有一个抽象中介者类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。同时,每个参与者(Colleague)都持有对中介者对象的引用,用于与中介者进行通信。

中介者模式的优点包括:

  1. 减少了对象之间的直接依赖,降低了耦合性,使得对象之间的交互更加灵活和可扩展。
  2. 将复杂的交互逻辑集中在中介者中,使得系统更易于理解和维护。
  3. 可以简化对象之间的通信流程,提高系统的可维护性和可扩展性。

然而,中介者模式也有一些注意事项:

  1. 过度使用中介者模式可能会导致中介者本身变得复杂和庞大,降低了代码的可读性和可维护性。因此,在应用中介者模式时需要谨慎权衡对象之间的交互复杂性和中介者的复杂性。
  2. 中介者模式可能会引入单点故障问题,即若中介者出现问题,则整个系统的交互可能会受到影响。因此,在设计中介者模式时需要考虑系统的稳定性和可靠性。

总结起来,中介者模式提供了一种通过中介者对象来管理多个对象之间交互的方式,解耦了对象之间的关系,同时简化了系统的设计和维护。它适用于对象之间的交互较为复杂、耦合度较高的场景,可以提高系统的灵活性和可扩展性。


🐱‍🐉二、中介者模式实现

在C++中实现中介者模式,可以按照以下步骤进行:

  1. 定义抽象中介者类(Mediator):该类定义了对象之间交互的接口方法。可以使用纯虚函数或者具有默认实现的虚函数来定义这些接口方法。
class Mediator {
public:
    virtual void sendMessage(const std::string& message, class Colleague* colleague) = 0;
};
  1. 定义具体中介者类(ConcreteMediator):实现抽象中介者类,并负责协调对象之间的交互。它通常会维护一个对象列表,用于管理参与者对象。
class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;
public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }
    void sendMessage(const std::string& message, Colleague* colleague) override {
        for (auto c : colleagues) {
            if (c != colleague) {
                c->receiveMessage(message);
            }
        }
    }
};
  1. 定义抽象参与者类(Colleague):该类定义了参与者对象的基本行为和属性,包括发送消息和接收消息的方法。
class Colleague {
protected:
    Mediator* mediator;
public:
    Colleague(Mediator* mediator) : mediator(mediator) {}
    virtual void sendMessage(const std::string& message) = 0;
    virtual void receiveMessage(const std::string& message) = 0;
};
  1. 定义具体参与者类(ConcreteColleague):实现抽象参与者类,并根据需要重写发送消息和接收消息的方法。
class ConcreteColleague : public Colleague {
public:
    ConcreteColleague(Mediator* mediator) : Colleague(mediator) {}
    void sendMessage(const std::string& message) override {
        mediator->sendMessage(message, this);
    }
    void receiveMessage(const std::string& message) override {
        std::cout << "Received Message: " << message << std::endl;
    }
};
  1. 在客户端代码中使用中介者模式:
int main() {
    ConcreteMediator mediator;
    ConcreteColleague colleague1(&mediator);
    ConcreteColleague colleague2(&mediator);
    mediator.addColleague(&colleague1);
    mediator.addColleague(&colleague2);
    colleague1.sendMessage("Hello, colleague2!");
    colleague2.sendMessage("Hi, colleague1!");
    return 0;
}

在上述示例中,我们创建了一个具体的中介者对象(ConcreteMediator),以及两个具体的参与者对象(ConcreteColleague)。中介者对象负责协调参与者对象之间的交互。每个参与者对象通过中介者对象来发送消息,并接收其他参与者对象的消息。

注意,在实际应用中,可能会有更复杂的参与者对象和中介者对象的交互逻辑,可以根据具体需求进行扩展和修改。同时,还可以考虑使用设计模式中的单例模式来保证中介者对象的唯一性。


🎉三、模块之间的关系

在中介者模式中,涉及以下几个模块之间的关系:

  1. 中介者(Mediator):中介者是一个抽象类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。
  2. 参与者(Colleague):参与者是指需要相互通信和交互的对象。每个参与者都持有对中介者对象的引用,用于与中介者进行通信。
  3. 具体中介者(ConcreteMediator):具体中介者类实现了中介者的接口,并负责协调参与者对象之间的交互。它维护了一个参与者对象的列表,并在接收到消息时通知其他参与者。
  4. 具体参与者(ConcreteColleague):具体参与者类实现了参与者的接口,并根据具体需求重写发送消息和接收消息的方法。它们通过中介者对象来发送消息,并接收其他参与者对象的消息。

整体关系如下图所示:

┌─────────────────┐
│    Mediator     │
├─────────────────┤
│+ sendMessage()  │
└─────────────────┘
┌─────────────────┐
│    Colleague    │
├─────────────────┤
│- mediator       │
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘
┌───────────────────────┐
│  ConcreteMediator     │
├───────────────────────┤
│- colleagues           │
│+ addColleague()       │
│+ sendMessage()        │
└───────────────────────┘
┌─────────────────┐
│ConcreteColleague│
├─────────────────┤
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘

在中介者模式中,参与者之间的交互通过中介者进行,参与者对象只需要与中介者对象进行通信,而无需了解其他参与者的存在和细节。这样一来,对象之间的耦合关系降低,系统的灵活性和可扩展性也提高了。中介者模式将复杂的交互逻辑集中在中介者中,简化了对象之间的通信和协作过程。


🐱‍🚀四、注意事项

在使用中介者模式时,有几个注意事项需要考虑:

  1. 中介者类的职责:中介者类负责协调对象之间的交互,但是需要注意避免将过多的责任和逻辑集中到中介者类中。如果中介者类变得过于庞大或复杂,可能会影响代码的可读性和维护性。因此,应该合理划分和分配参与者之间的交互逻辑,确保中介者类不至于过于臃肿。
  2. 参与者与中介者的耦合关系:虽然中介者模式可以降低参与者之间的直接依赖关系,但是参与者对象仍然需要持有对中介者对象的引用。这种引用关系会带来一定的耦合。因此,需要权衡每个参与者对象是否真正需要与中介者进行通信,并根据实际需求进行设计。
  3. 单一职责原则:参与者对象应该专注于自己的职责和行为,而不应与其他参与者对象之间直接通信。中介者模式提供了一种协调机制,以确保参与者对象之间的交互通过中介者进行。因此,在设计参与者对象时,遵循单一职责原则,将其职责和行为限制在合理的范围内。
  4. 中介者对象的唯一性:在实际应用中,可能需要确保只有一个中介者对象存在。这可以通过使用单例模式来实现,以保证系统中的中介者对象是唯一的。
  5. 系统稳定性和可靠性:中介者模式引入了一个中心化的协调机制,使得参与者对象之间的交互依赖于中介者对象。因此,在设计和实现中介者模式时,需要考虑系统的稳定性和可靠性。如果中介者对象出现问题或故障,可能会影响整个系统的功能和性能。

综上所述,中介者模式可以提供一种解耦和协调对象之间交互的方式,但也需要注意合理划分职责、避免过度集中逻辑、权衡参与者与中介者的耦合关系,并确保系统的稳定性和可靠性。


🎂五、使用场景

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

  1. 对象之间的交互复杂:当多个对象之间的交互变得复杂且难以维护时,可以使用中介者模式将交互逻辑集中管理。中介者模式能够简化对象之间的通信流程,提高系统的可维护性和可扩展性。
  2. 对象之间的耦合度高:当对象之间的耦合度较高且需要解耦时,中介者模式可以起到解耦的作用。通过引入一个中介者对象,参与者对象只需要与中介者进行通信,而无需直接依赖其他参与者对象。
  3. 系统中的消息传递和调度:当系统中存在大量的消息传递和调度时,中介者模式可以提供一种集中管理消息传递和调度的方式。中介者作为调度器,负责协调和分发消息,简化了系统中的消息处理逻辑。
  4. 事件驱动系统:当系统需要响应多个不同对象的事件,并且这些事件之间有关联或依赖关系时,中介者模式可以帮助管理和协调这些事件的处理。中介者充当了事件的中心调度者,使得各个对象之间的事件处理更加灵活和可扩展。
  5. GUI应用程序:图形用户界面(GUI)应用程序中,通常存在多个控件和组件之间的交互。使用中介者模式可以简化控件之间的通信和协作,提高用户界面的可维护性和可扩展性。

需要注意的是,中介者模式可能会引入一个单点故障问题,即如果中介者对象出现问题或故障,整个系统的交互可能会受到影响。因此,在应用中介者模式时需要权衡系统的稳定性和可靠性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于中介者模式的知识。


目录
相关文章
|
6月前
|
设计模式 Java 开发者
Java设计模式【二十一】:状态模式
Java设计模式【二十一】:状态模式
53 0
|
6月前
|
设计模式 Java
小谈设计模式(26)—中介者模式
小谈设计模式(26)—中介者模式
|
6月前
|
设计模式 Java
小谈设计模式(25)—职责链模式
小谈设计模式(25)—职责链模式
|
6月前
|
设计模式 算法 Java
小谈设计模式(29)—访问者模式
小谈设计模式(29)—访问者模式
|
6月前
|
设计模式 Java
小谈设计模式(17)—状态模式
小谈设计模式(17)—状态模式
|
6月前
|
设计模式 存储 Java
小谈设计模式(19)—备忘录模式
小谈设计模式(19)—备忘录模式
|
6月前
|
设计模式 存储 机器学习/深度学习
掌握C++中介者模式:设计与应用全攻略
掌握C++中介者模式:设计与应用全攻略
102 0
|
设计模式 存储 算法
2023-7-8-第十四式策略模式
2023-7-8-第十四式策略模式
85 0
|
6月前
|
设计模式 Java
Java设计模式【十八】:中介者模式
Java设计模式【十八】:中介者模式
42 0
|
6月前
|
设计模式 算法 Java
Java设计模式【二十五】:访问者模式
Java设计模式【二十五】:访问者模式
40 0