用一个中介对象来封装一系列的对象。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
a1 定义一个中介者接口类IMediator,定义两个接口函数send()和add(),send()转发同事的消息,add()往同事集合增加同事; a2 定义一个具体中介者类ConcreteMediator,实现接口函数send()和add(); a3 定义一个同事接口类IColleague,定义两个接口函数send()和notify(),send()往中介者发消息然后通过中介者转发给目标同事,notify()为为该同事要发送的内容; a4 定义一个具体同事类ConcreteColleague,实现接口函数send()和notify();
AdapterPattern.cpp
#include <iostream> #include <vector> using namespace std; #define DELETE(pointer) delete pointer; pointer=nullptr class Colleague; class IMediator //抽象产品 { protected: vector<Colleague *> colleagues; // 维护和封装一系列同事对象 public: IMediator() : colleagues(0) {} virtual ~IMediator() {} virtual void add(Colleague *colleague) = 0; // 增加同事类 virtual void send(Colleague *colleague) = 0; // 转发同事类消息 }; class Colleague { protected: IMediator *mediator; // 中介者接口 public: Colleague(IMediator *mediator) :mediator(mediator) {} virtual void notify() = 0; // 要发消息的内容 virtual void send() = 0; // 消息发布到中介者动作 }; class ConcreteColleague1 : public Colleague //具体同事1 { public: ConcreteColleague1(IMediator *mediator) : Colleague(mediator) {} virtual void notify() { cout << "我是租客,要租房!" << endl; } virtual void send() { mediator->send(this); } }; class ConcreteColleague2 : public Colleague //具体同事2 { public: ConcreteColleague2(IMediator *mediator) : Colleague(mediator) {} virtual void notify() { cout << "我是房东,要出租房!" << endl; } virtual void send() { mediator->send(this); } }; class ConcreteMediator : public IMediator //具体中介者,要放在具体类同事1和具体同事2的后面,否则调用notify函数会报错没定义 { public: void add(Colleague *colleague) override { colleagues.push_back(colleague); } void send(Colleague *colleague) override { for (auto *iter : colleagues) if (iter == colleague) { iter->notify(); break; } } }; void doMediatorPattern() { // 初始化中介者对象、同事1对象、同事2对象 IMediator *mediator = new ConcreteMediator(); Colleague *colleague1 = new ConcreteColleague1(mediator); Colleague *colleague2 = new ConcreteColleague2(mediator); mediator->add(colleague1); // 中介者把同事加入同事集合 mediator->add(colleague2); colleague1->send(); // 租客在中介者发布租房信息 colleague2->send(); // 房东也在中介者发布出租房信息 DELETE(colleague2); DELETE(colleague1); DELETE(mediator); }mian.cpp
#include <iostream> extern void doMediatorPattern(); int main() { doMediatorPattern(); system("pause"); return 1; }中介者模式在代码实现上跟观察者模式类似,两者异同如下所述: 相同点:都是在抽象类IMediator用数组vector来封装要通知的目标对象,然后通过遍历该vector来通知目标对象; 区别:中介者通知某一个对象,而观察者通知所有对象;
C++实现中介者模式 设计模式之C++实现(20):中介者模式(Mediator Pattern) 设计模式C++实现(13)——中介者模式 陈建忠设计模式(参考:哔哩哔哩C++设计模式!!!) Erich Gamma,Richard Helm.《设计模式 可复用面向对象软件的基础》[M].机械工业出版社,2019: