首页 > 代码库 > Mediator中介者模式(含个人Demo源码)
Mediator中介者模式(含个人Demo源码)
重新温习GOF23到第18个中介者模式了,感觉还是蛮不错的,写了一个小小的Demo来解释下他们之间的关系。
中介者模式其实就相当于:中介,租房人,还有房主三者之间的关系。
房主A,租房人B首先联系了中介,在中介那里记名字了。
房主A有空房了,发条消息给中介,中介将A有空房的消息发给其他人。
在此之上,demo做了小小扩充,当又有租房人C联系中介,B发了条消息,A与C都会收到B的消息。
#include <iostream> #include <vector> using namespace std; #include <crtdbg.h> class Person; class Mediator { public: virtual void SendMsg(string msg, Person *pItem) = 0; }; class Person { public: Person(Mediator *pMediator):m_pMediator(pMediator) { } virtual void Say(string msg) = 0; virtual void GetMsg(string msg) = 0; protected: Mediator *m_pMediator; }; class PersonA : public Person { public: PersonA(Mediator *pMediator):Person(pMediator) { } virtual void Say(string msg) { cout<<"PersonA said:"<<endl; m_pMediator->SendMsg(msg, this); } void GetMsg(string msg) { cout<<"PersonA GetMsg: "<<msg.c_str()<<endl; } }; class PersonB : public Person { public: PersonB(Mediator *pMediator):Person(pMediator) { } virtual void Say(string msg) { cout<<"PersonB said:"<<endl; m_pMediator->SendMsg(msg, this); } void GetMsg(string msg) { cout<<"PersonB GetMsg: "<<msg.c_str()<<endl; } private: }; class PersonC : public Person { public: PersonC(Mediator *pMediator):Person(pMediator) { } virtual void Say(string msg) { cout<<"PersonC said:"<<endl; m_pMediator->SendMsg(msg, this); } void GetMsg(string msg) { cout<<"PersonC GetMsg: "<<msg.c_str()<<endl; } private: }; class ConcreateMediator : public Mediator { private: vector<Person*> conentList; public: void AddFriend(Person* pPerson) // 没有添加该好友,则添加进去 { vector<Person*>::iterator iter = conentList.begin(); for (; iter != conentList.end(); iter++) { if(*iter == pPerson) break; } if(iter == conentList.end()) { conentList.push_back(pPerson); } } void SendMsg(string msg, Person *pItem) //如假设A不认识其他人,A发送信息,通过中介,则可以发送给其他的人 { vector<Person*>::iterator iter = conentList.begin(); while(iter != conentList.end()) { if(*iter != pItem) (*iter)->GetMsg(msg); iter++; } } }; void main() { _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF) | _CRTDBG_LEAK_CHECK_DF); ConcreateMediator *pMediator = new ConcreateMediator(); Person *pA = new PersonA(pMediator); Person *pB = new PersonB(pMediator); Person *pC = new PersonC(pMediator); pMediator->AddFriend(pA); pMediator->AddFriend(pB); pA->Say("call JesonYang"); pMediator->AddFriend(pC); pB->Say("demo by yc7369"); delete pA; delete pB; delete pC; delete pMediator; }
Mediator中介者模式(含个人Demo源码)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。