C++ 设计模式《业务模块的调度室》
👨🎓 模式名称:中介者模式(Controller)
👦 故事背景:
小明的校园创业平台业务越来越多了:
- 外卖服务(FoodModule)
- 快递代取(ExpressModule)
- 校园保洁(CleanModule)
这些模块彼此通信非常混乱!
比如快递服务完成后需要通知用户 + 通知清洁员打扫 + 通知外卖暂停投递……
每个模块都引用其他模块,代码越来越难维护,小明快崩溃了 !
❌ 没有中介者模式的实现(模块之间直接通信)
每个模块都持有其他模块引用,耦合严重!
class CleanModule;
class FoodModule;class ExpressModule {
public:void onExpressPicked(CleanModule* clean, FoodModule* food) {std::cout << "快递已代取,通知保洁和外卖暂停!\n";clean->cleanRoom();food->pauseDelivery();}
};class CleanModule {
public:void cleanRoom() {std::cout << "保洁阿姨准备打扫了!\n";}
};class FoodModule {
public:void pauseDelivery() {std::cout << "外卖暂停配送,等清洁完再送。\n";}
};
每加一个模块,就要在所有模块里修改逻辑 ➜ 违背开闭原则!
✅ 使用中介者模式的解决方案
小明创建一个“统一调度中心(Mediator)”,各模块只跟它打交道,由它协调模块之间的互动
抽象中介者
class Mediator {
public:virtual void notify(const std::string& event) = 0;virtual ~Mediator() = default;
};
各模块(组件)
class FoodModule {Mediator* mediator;
public:FoodModule(Mediator* m) : mediator(m) {}void pauseDelivery() {std::cout << "外卖暂停配送。\n";}void resumeDelivery() {std::cout << "外卖恢复配送。\n";}
};class CleanModule {Mediator* mediator;
public:CleanModule(Mediator* m) : mediator(m) {}void cleanRoom() {std::cout << "保洁阿姨开始打扫……🧹\n";mediator->notify("clean_done");}
};class ExpressModule {Mediator* mediator;
public:ExpressModule(Mediator* m) : mediator(m) {}void pickUpPackage() {std::cout << "快递已代取📦,开始通知清洁!\n";mediator->notify("express_picked");}
};
具体中介者实现
class DispatchCenter : public Mediator {FoodModule* food;CleanModule* clean;ExpressModule* express;
public:DispatchCenter() : food(nullptr), clean(nullptr), express(nullptr) {}void setModules(FoodModule* f, CleanModule* c, ExpressModule* e) {food = f; clean = c; express = e;}void notify(const std::string& event) override {if (event == "express_picked") {food->pauseDelivery();clean->cleanRoom();} else if (event == "clean_done") {food->resumeDelivery();}}
};
使用方式
int main() {DispatchCenter mediator;FoodModule food(&mediator);CleanModule clean(&mediator);ExpressModule express(&mediator);mediator.setModules(&food, &clean, &express);express.pickUpPackage(); // 快递取件后自动触发协调
}
✅ 效果 & 优点
| 优势 | 描述 |
|---|---|
| 🧠 解耦 | 各模块不再相互引用,只依赖中介者 |
| 📈 易扩展 | 新增模块只需要修改中介者逻辑 |
| 🔍 逻辑集中 | 所有模块交互逻辑集中于中介者类 |
