中介者模式
一、动机
1.在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。
2.在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。
二、介绍
意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用: 多个类相互耦合,形成了网状结构。
如何解决: 将上述网状结构分离为星型结构。
关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
**缺点:**中介者会庞大,变得复杂难以维护。
使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
注意事项: 不应当在职责混乱的时候使用。
三、结构
四、要点总结
1.将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象相互关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。
2.随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。
3.Facade模式是解耦系统间(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。
五、代码展示
#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); } int main() { doMediatorPattern(); system("pause"); return 1; }