中介者(Mediator)模式
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
代码:
#include <iostream> #include <string> using namespace std; class Mediator; class Person { public: virtual ~Person() {} public: virtual void setMediator(Mediator *m) {} // 设置中介 virtual void sendMessage(string message){} // 发送消息 virtual void getMessage(string message){} // 获取消息 protected: Mediator *_mediator; }; class Mediator { public: virtual ~Mediator() {} public: virtual void setLandlord(Person *p) {} // 设置房东 virtual void setRenter(Person *p) {} // 设置租客 virtual void sendMessage(string message, Person *p) {} // 转发消息 }; class Landlord : public Person { public: void setMediator(Mediator *m) { _mediator = m; } void sendMessage(string message) { _mediator->sendMessage(message, this); } void getMessage(string message) { cout << "房东收到租客发来的消息:" << message << endl; } }; class Renter : public Person { public: void setMediator(Mediator *m) { _mediator = m; } void sendMessage(string message) { _mediator->sendMessage(message, this); } void getMessage(string message) { cout << "租客收到房东发来的消息: " << message << endl; } }; class HouseMediator : public Mediator { public: void setLandlord(Person *p) { _landlord = p; } void setRenter(Person *p) { _renter = p; } void sendMessage(string message, Person *p) { if (p == _landlord) // 房东发送信息 { _renter->getMessage(message); } else // 租客发送信息 { _landlord->getMessage(message); } } private: Person *_landlord; // 房东 Person *_renter; // 租客 }; void test() { Mediator *mediator = new HouseMediator; // 房屋中介 Person *renter = new Renter; // 租客 Person *landlord = new Landlord; // 房东 mediator->setLandlord(landlord); mediator->setRenter(renter); renter->setMediator(mediator); landlord->setMediator(mediator); renter->sendMessage("我想在上海火车站附近租房子,一室一厅"); landlord->sendMessage("我想出租一室一厅的房子,地点:上海火车站附近"); delete mediator; delete renter; delete landlord; } int main() { test(); cin.get(); return 0; }
效果: