名企刷题
剑指Offer分类练习
现实需求:你刚刚参力口工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。
中介者模式:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
优点:
降低了对象之间的耦合性,使得对象易于独立地被复用。
将对象间的一对多关联转变为一对一的关联,使系统易于维护和扩展。
缺点:当同事类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。
主要角色:
抽象中介者:中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
具体中介者:实现中介者接口,协调各个同事角色之间的交互关系
抽象同事类:同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
具体同事类:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
案例:小码路上班经常很晚回来,于是买的快递寄到家时候只能告诉快递员放在驿站了哦,小码路作为客户与快递员进行信息交流。
第一步:抽象人类
#include #include using namespace std; #define Delete(person) if(person){delete person; person=NULL;} //声明中介驿站,快递员把快递放到驿站,客户去取 class YiZhan; //定义抽象人类,快递员和客户都是人类的子类 class Person { public: virtual void SetYiZhan(YiZhan *yizhan){} virtual void SendMessage(string &message){} virtual void GetMessage(string &message){} protected: YiZhan *_yizhan; };
第二步:抽象中介类
//定义抽象中介类 class YiZhan { public: virtual void Send(string &message, Person *person){} virtual void SetKuaiDiYuan(Person *kuaidiyuan){} virtual void SetKeHu(Person *kehu){} };
第三步:具体人类
//定义快递员 class KuaiDiYuan:public Person { public: void SetYiZhan(YiZhan *yizhan){ _yizhan = yizhan; } void SendMessage(string &message){ _yizhan->Send(message,this); } void GetMessage(string &message){ cout<<"客户收到快递员发来快递已经到达,请取件的消息"<<endl; cout<<message; } }; //定义客户类 class KeHu:public Person { public: void SetYiZhan(YiZhan *yizhan){_yizhan = yizhan;} void SendMessage(string &message){ _yizhan->Send(message,this); } void GetMessage(string &message){ cout<<"快递员收到客户的回信,知道了,放在驿站吧"<<endl; cout<<message; } };
第四步:具体中介类
//定义菜鸟驿站,具体中介 class CaiNiaoYiZhan:public YiZhan{ public: CaiNiaoYiZhan():_kehu(NULL),_kuaidiyuan(NULL){} void SetKeHu(Person *kehu){ _kehu=kehu; } void SetKuaiDiYuan(Person *kuaidiyuan){ _kuaidiyuan = kuaidiyuan; } void Send(string &message, Person *person){ //接收消息的对象为该对象的对应对象 if(person == _kehu) _kuaidiyuan->GetMessage(message); else _kehu->GetMessage(message); } private: Person *_kehu; Person *_kuaidiyuan;};
第五步:客户端
int main(){ YiZhan *yizhan=new CaiNiaoYiZhan(); Person *p1=new KeHu(); Person *p2=new KuaiDiYuan(); yizhan->SetKeHu(p1); yizhan->SetKuaiDiYuan(p2); p1->SetYiZhan(yizhan); p2->SetYiZhan(yizhan); string s1="我上周买的一本书终于到了 \n"; string s2="好的,那我就放在菜鸟驿站了,记得取啊\n"; p1->SendMessage(s1); p2->SendMessage(s2); //p1->SendMessage(string("我上周买的一本书放到哪里了呢? \n"));//这样会报错的,临时变量不能作为非const引用传入 //p2->SendMessage(string("实在抱歉,我记得给你放菜鸟驿站了,你再找找\n")); Delete(p1); Delete(p2); Delete(yizhan);}
结果显示:
推荐阅读
设计模式之里氏替换原则C++实现
设计模式之开闭原则C++实现
设计模式之依赖倒置原则C++实现
设计模式之单一职责原则C++实现
设计模式之接口隔离原则C++实现
设计模式之迪米特法则C++实现
创建型之单例模式C++实现
创建型之工厂方法模式C++实现
创建型之原型模式C++实现
创建型之抽象工厂模式C++实现
创建型之建造者模式C++实现
结构型之代理模式C++实现
结构型之适配器模式C++实现
结构型之装饰模式C++实现
结构型之外观模式C++实现
结构型之桥接模式C++实现
结构型之组合模式C++实现
结构型之享元模式C++实现
行为型之模板方法C++实现
行为型之策略模式C++实现
行为型之状态模式C++实现
行为型之责任链模式C++实现
行为型之命令模式C++实现