手写《C++20设计模式》中介者模式

一、前言

个人感觉最后几种行为模式都很难,而且很重要。
对于中介者模式浅层理解就是,从原来所有相关对象彼此通信变为,引入一个中介者对象,让所有的相关对象通过中介者来通信,而不是直接彼此通信。

也就是常说的从网状结构,变成星形结构。

那这个模式到底是怎么实现的呢?

引入中介者对象,该对象控制其他相关信息的收发

相关代码可以在这里,如有帮助给个star!AidenYuanDev/design_patterns_in_modern_Cpp_20

二、实现

1、UML类图

中介者模式

2、实现

#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class User;

class Mediator_Base {
public:
    virtual void send_message(const string &message, User *sender) = 0;
};

class User {
protected:
    string name;
    weak_ptr<Mediator_Base> mediator;

public:
    explicit User(const string &name, shared_ptr<Mediator_Base> mediator) : name(name), mediator(mediator) {}
    virtual void send(const string &message) = 0;
    virtual void receive(const string &message) = 0;
};

class User_A : public User {
public:
    explicit User_A(const string &name, shared_ptr<Mediator_Base> mediator) : User(name, mediator) {}

    void send(const string &message) override {
        cout << "用户" << name << ": 发送消息: " << message << endl;
        if (auto med = mediator.lock()) med->send_message(message, this);
    }

    void receive(const string &message) override { cout << "用户" << name << ": 收到消息" << endl; }
};

class User_B : public User {
public:
    explicit User_B(const string &name, shared_ptr<Mediator_Base> mediator) : User(name, mediator) {}

    void send(const string &message) override {
        cout << "用户" << name << ": 发送消息: " << message << endl;
        if (auto med = mediator.lock()) med->send_message(message, this);
    }

    void receive(const string &message) override { cout << "用户" << name << ": 收到消息" << endl; }
};

class Mediator : public Mediator_Base, public enable_shared_from_this<Mediator> {
private:
    vector<shared_ptr<User>> users;

public:
    void send_message(const string &message, User *sender) {
        for (const auto &user : users) {
            if (user.get() == sender) continue;
            user->receive(message);
        }
    }

    shared_ptr<Mediator> add_user(shared_ptr<User> user) { 
        users.push_back(user);
        return shared_from_this();
    }
};

int main() { 
    auto mediator = make_shared<Mediator>();
    auto user_a = make_shared<User_A>("A", mediator);
    auto user_b = make_shared<User_B>("B", mediator);

    mediator->add_user(user_a)
            ->add_user(user_b);
    
    user_a->send("你好,叫我小a就可以");
    user_b->send("你也好呀,你可以叫我小b");

    return 0;
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值