现代C++实现优雅中介者模式,树莓派上市后的开源抉择:价格、纯度与生态。

中介者模式的核心思想

中介者模式(Mediator Pattern)属于行为型设计模式,旨在减少对象之间的直接耦合,通过引入一个中介对象来协调多个对象之间的交互。该模式的核心思想是将复杂的网状依赖关系转化为星型结构,使对象间的通信集中在中介者上,从而提升代码的可维护性和扩展性。

适用场景

  • 对象之间存在大量复杂的相互依赖关系,导致代码难以维护。
  • 需要动态调整对象间的交互逻辑,而不希望直接修改每个相关对象。
  • 多个对象需要共享行为,但又不适合通过继承实现。

模式结构

  • Mediator(中介者接口):定义对象间通信的抽象方法。
  • ConcreteMediator(具体中介者):实现中介者接口,协调各具体对象的行为。
  • Colleague(同事类):定义对象的通用接口,通常包含对中介者的引用。
  • ConcreteColleague(具体同事类):实现同事类接口,与其他同事类通过中介者交互。

C++20 实现示例

以下是一个基于现代 C++(C++20)的中介者模式实现,使用智能指针和模板优化设计:

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

// 前置声明
class Colleague;

// 中介者抽象接口
class Mediator {
public:
    virtual void notify(std::shared_ptr<Colleague> sender, const std::string& event) = 0;
    virtual ~Mediator() = default;
};

// 同事类抽象基类
class Colleague {
protected:
    std::shared_ptr<Mediator> mediator_;
public:
    explicit Colleague(std::shared_ptr<Mediator> mediator) : mediator_(mediator) {}
    virtual void send(const std::string& event) = 0;
    virtual void receive(const std::string& event) = 0;
    virtual ~Colleague() = default;
};

// 具体中介者
class ConcreteMediator : public Mediator, public std::enable_shared_from_this<ConcreteMediator> {
private:
    std::vector<std::shared_ptr<Colleague>> colleagues_;
public:
    void addColleague(std::shared_ptr<Colleague> colleague) {
        colleagues_.push_back(colleague);
    }
    void notify(std::shared_ptr<Colleague> sender, const std::string& event) override {
        for (const auto& colleague : colleagues_) {
            if (colleague != sender) {
                colleague->receive(event);
            }
        }
    }
};

// 具体同事类
class ConcreteColleague : public Colleague {
private:
    std::string name_;
public:
    ConcreteColleague(std::shared_ptr<Mediator> mediator, const std::string& name)
        : Colleague(mediator), name_(name) {}
    void send(const std::string& event) override {
        std::cout << name_ << " sends: " << event << std::endl;
        mediator_->notify(shared_from_this(), event);
    }
    void receive(const std::string& event) override {
        std::cout << name_ << " receives: " << event << std::endl;
    }
};

int main() {
    auto mediator = std::make_shared<ConcreteMediator>();
    auto colleague1 = std::make_shared<ConcreteColleague>(mediator, "Colleague1");
    auto colleague2 = std::make_shared<ConcreteColleague>(mediator, "Colleague2");
    mediator->addColleague(colleague1);
    mediator->addColleague(colleague2);
    colleague1->send("Hello from Colleague1!");
    colleague2->send("Hi from Colleague2!");
    return 0;
}

关键优化点

  1. 智能指针管理生命周期:使用 std::shared_ptr 避免手动内存管理,确保资源安全释放。
  2. C++20 的 std::enable_shared_from_this:解决中介者与同事类之间的循环引用问题。
  3. 事件驱动设计:通过 notifyreceive 方法实现松耦合通信。

模式优缺点

优点

  • 减少对象间的直接依赖,简化交互逻辑。
  • 集中控制交互行为,便于扩展和维护。
  • 符合迪米特法则(最少知识原则)。

缺点

  • 中介者可能成为单点故障,复杂性会随交互逻辑增加。
  • 过度使用可能导致中介者类过于庞大。

实际应用案例

  • GUI 框架:窗口组件(按钮、文本框)通过中介者(如对话框)协调交互。
  • 聊天系统:用户通过聊天室中介者发送和接收消息。
  • 游戏开发:角色与道具的交互通过游戏引擎中介者管理。

通过合理使用中介者模式,可以显著提升代码的可维护性和灵活性,尤其在复杂交互场景中表现突出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值