大话设计模式之中介者模式

中介者模式是一种行为型设计模式,它通过引入一个中介者对象来封装一系列对象之间的交互,从而减少对象之间的直接通信,使得对象之间的耦合度降低,同时提高了系统的可维护性和灵活性。

在中介者模式中,对象之间的通信不再直接发生,而是通过中介者对象来进行。当一个对象需要与其他对象进行交互时,它不会直接与其他对象通信,而是将请求发送给中介者对象,由中介者对象负责将请求传递给合适的对象,并且可以在必要时对请求进行转发、过滤或者其他处理。

中介者模式通常包含以下几个角色:

  • 中介者(Mediator):定义一个接口用于与各个同事对象通信。
  • 具体中介者(Concrete Mediator):实现中介者接口,负责协调各个同事对象的交互关系。
  • 同事(Colleague):定义一个接口用于与中介者对象通信。
  • 具体同事(Concrete Colleague):实现同事接口,并与其他同事对象交互。
cpp 复制代码
#include <iostream>
#include <string>
#include <vector>

// 前置声明
class Mediator;

// 同事抽象类
class Colleague {
public:
    virtual ~Colleague() {}
    virtual void send(const std::string& message) const = 0;
    virtual void receive(const std::string& message) const = 0;
    virtual void setMediator(Mediator* mediator) {
        mediator_ = mediator;
    }

protected:
    Mediator* mediator_;
};

// 具体同事类 A
class ConcreteColleagueA : public Colleague {
public:
    void send(const std::string& message) const override {
        mediator_->distributeMessage(this, message);
    }

    void receive(const std::string& message) const override {
        std::cout << "Concrete Colleague A received: " << message << std::endl;
    }
};

// 具体同事类 B
class ConcreteColleagueB : public Colleague {
public:
    void send(const std::string& message) const override {
        mediator_->distributeMessage(this, message);
    }

    void receive(const std::string& message) const override {
        std::cout << "Concrete Colleague B received: " << message << std::endl;
    }
};

// 中介者抽象类
class Mediator {
public:
    virtual ~Mediator() {}
    virtual void distributeMessage(const Colleague* sender, const std::string& message) const = 0;
};

// 具体中介者类
class ConcreteMediator : public Mediator {
public:
    void addColleague(Colleague* colleague) {
        colleagues_.push_back(colleague);
    }

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

private:
    std::vector<Colleague*> colleagues_;
};

int main() {
    ConcreteColleagueA colleagueA;
    ConcreteColleagueB colleagueB;

    ConcreteMediator mediator;
    mediator.addColleague(&colleagueA);
    mediator.addColleague(&colleagueB);

    colleagueA.setMediator(&mediator);
    colleagueB.setMediator(&mediator);

    colleagueA.send("Hello from Colleague A");
    colleagueB.send("Hi from Colleague B");

    return 0;
}

/*
在这个示例中,Colleague 是同事抽象类,定义了发送和接收消息的接口,并维护了一个中介者指针。ConcreteColleagueA 和 ConcreteColleagueB 是具体的同事类,实现了同事接口。Mediator 是中介者抽象类,定义了分发消息的接口。ConcreteMediator 是具体的中介者类,负责协调各个同事对象之间的消息传递。在 main() 函数中,我们创建了具体的同事对象和中介者对象,并设置了它们之间的关系,然后通过同事对象向中介者发送消息。
*/

觉得有帮助的话,打赏一下呗。。

相关推荐
数据智能老司机1 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴1 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤1 天前
工厂模式
设计模式
幂简集成explinks2 天前
e签宝签署API更新实战:新增 signType 与 FDA 合规参数配置
后端·设计模式·开源
大飞pkz2 天前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
努力也学不会java2 天前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
青草地溪水旁2 天前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(2)
c++·设计模式·抽象工厂模式
青草地溪水旁2 天前
设计模式(C++)详解—抽象工厂模式 (Abstract Factory)(1)
c++·设计模式·抽象工厂模式
Magnetic_h3 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa