【c++设计模式19】行为模式4:中介者模式(Mediator Pattern)

原创作者:郑同学的笔记
原创地址:https://zhengjunxue.blog.csdn.net/article/details/132630529
qq技术交流群:921273910

类型序号设计模式描述
行为模式1责任链模式
(Chain of Responsibility)
将这些处理者连成一条链。 链上的每个处理者都有一个成员变量来保存下一个处理者。
2命令模式
(Command Pattern)
它将请求封装为一个对象,从而使得可以用不同的请求对客户端进行参数化或将请求放入队列中
3迭代器模式
(Iterator Pattern)
它提供了一种顺序访问聚合对象中各个元素的方法,而不暴露其内部表示。
4中介者模式
(Mediator Pattern)
通过中介对象进行通信,从而降低了对象之间的耦合性。
5备忘录模式
(Memento Pattern)
当需要保存和恢复对象的状态时,可以使用备忘录模式。
6观察者模式
(Observer Pattern)
当一个对象的状态发生改变时,所有依赖它的对象都会自动收到通知并更新。
7策略模式
(Strategy Pattern)
定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。客户端代码在运行时选择所需的算法。
8状态模式
(State Pattern
是在一个类的内部会有多种状态的变化,因为状态变化从而导致其行为的改变,在类的外部看上去这个类就像是自身发生了改变一样。
9模板方法模式
(Template Method Pattern)
定义了算法的基本骨架,而具体方法则由子类提供具体实现。
10访问者模式
(Visitor Pattern)
访问者定义了针对不同元素的操作方法,而元素则是被访问者访问的对象。

中介者模式(Mediator Pattern)是一种行为型设计模式,它提供了一种通过中介对象来协调多个对象之间的交互的方法。中介者模式使各个对象之间不直接相互通信,而是通过中介对象进行通信,从而降低了对象之间的耦合性。

定义

一、定义

中介者模式定义了一个中介者接口(Mediator),该接口包含了协调多个对象之间的方法。具体中介者类(Concrete Mediator)实现了中介者接口,并且对多个相关对象之间的交互进行控制。每个相关对象(Colleague)都包含一个指向中介者对象的引用,并且在需要与其他相关对象通信时,通过中介者对象来进行交互。

二、适用场景

中介者模式适用于以下情况:

  • 当一组对象之间存在复杂的相互依赖关系,导致它们之间的通信和维护困难时,可以使用中介者模式来简化对象之间的交互。
  • 当一组对象之间存在多对多的交互关系,导致对象之间的通信逻辑复杂时,可以使用中介者模式来集中管理对象之间的交互。
  • 当一个对象的修改会影响其他相关对象的状态时,可以使用中介者模式来统一管理对象之间的状态变化。
  • 当希望将对象之间的通信逻辑独立出来,以支持更灵活的交互方式时,可以使用中介者模式。

三、过程

中介者模式的过程包括以下几个角色:

中介者接口(Mediator Interface):定义了各个同事对象之间通信的方法。
具体中介者(Concrete Mediator):实现了中介者接口,负责协调各个同事对象之间的通信。
同事对象接口(Colleague Interface):定义了向中介者发送和接收消息的方法。
具体同事对象(Concrete Colleague):实现了同事对象接口,通过中介者来发送和接收消息。

四、中介者模式类图

当一些对象和其他对象紧密耦合以致难以对其进行修改时;当组件因过于依赖其他组件而无法在不同应用中复用时;当为了能在不同情景下复用一些基本行为,导致需要被迫创建大量组件子类时,都可使用中介者模式。

在这里插入图片描述

五、C++示例代码

以下是一个使用中介者模式的示例代码,在这个示例中,我们通过一个聊天室的例子来展示中介者模式的使用:

#include <iostream>
#include <string>
#include <vector>

// 中介者接口
class Mediator;

// 同事对象接口
class Colleague {
protected:
    Mediator* mediator;
    std::string m_name;

public:
    explicit Colleague(Mediator* mediator,std::string name) : mediator(mediator),m_name(name) {}

    virtual void send(const std::string& message) = 0;
    virtual void receive(const std::string& message) = 0;
};

// 中介者接口
class Mediator {
public:
    virtual void mediate(const std::string& message, Colleague* sender) = 0;
};

// 具体中介者
class ConcreteMediator : public Mediator {
private:
    std::vector<class Colleague*> colleagues;

public:
    void addColleague(class Colleague* colleague) {
        colleagues.push_back(colleague);
    }

    void mediate(const std::string& message, Colleague* sender) override {
        for (auto col : colleagues) {
            if (col != sender) {
                col->receive(message);
            }
        }
    }
};

// 具体同事对象
class ConcreteColleague : public Colleague {
public:
    using Colleague::Colleague;

    void send(const std::string& message) override {
        std::cout << m_name<<" Send message: " << message << std::endl;
        mediator->mediate(message, this);
    }

    void receive(const std::string& message) override {
        std::cout << m_name << " Received message: " << message << std::endl;
    }
};

int main() {
    ConcreteMediator mediator;

    ConcreteColleague colleague1(&mediator,"小明");
    ConcreteColleague colleague2(&mediator,"小二黑");

    mediator.addColleague(&colleague1);
    mediator.addColleague(&colleague2);

    colleague1.send("Hello, 小黑!你吃了么");

    std::cout << "\n";
    colleague2.send("Hi, 我吃过了!");

    return 0;
}

输出

在这里插入图片描述

在上述示例中,我们定义了中介者接口 Mediator,其中声明了 mediate() 方法来协调各个同事对象之间的通信。

具体中介者类 ConcreteMediator 实现了中介者接口,负责管理同事对象之间的通信。

同事对象接口 Colleague 定义了向中介者发送和接收消息的方法。

具体同事对象类 ConcreteColleague 实现了同事对象接口,通过中介者来发送和接收消息。

在 main 函数中,我们实例化了具体中介者对象 ConcreteMediator,以及两个具体同事对象 ConcreteColleague,并将它们注册到中介者中。然后我们通过调用同事对象的 send() 方法来发送消息,中介者会负责将消息传递给其他同事对象进行处理。

六、使用注意事项

中介者模式可以降低对象之间的耦合性,将复杂的相互依赖关系封装在中介者对象中。
在设计中介者模式时,要考虑实现中介者接口和同事对象接口,以及具体中介者和具体同事对象的实现。
中介者模式要求各个同事对象之间必须通过中介者对象进行通信,不直接相互调用。
中介者模式可以将对象之间的通信逻辑集中管理,使代码更易于维护和扩展。
当需要增加新的对象或修改对象之间的交互方式时,只需调整中介者对象即可,无需修改各个同事对象。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐