设计模式之十八------Mediator(中介者)

来源:互联网 发布:淘宝客会终止合作吗 编辑:程序博客网 时间:2024/05/03 16:56

  问题:

在类的交互中,如果有多个类,他们之间需要相互调用,那么每个类都需要持有其他的类;这样他们之间的关系十分复杂,并且占用大量的内存空间;

解决方案:

建立一个中介机构,这个中介机构类持有所有的这些类。所有的类持有这个中介机构。类需要交互时,只需要和这个中介机构进行交互就足矣了,中介机构负责和其他类交互;

这样就把多对多转化成了一对多;复杂度大量降低了。

实现代码如下: 

#include <IOSTREAM>#include<STRING>using namespace std;class College;class Mediator{public:virtual void ActionAToB()=0;virtual void ActionBToA()=0;virtual void SetA(College *a)=0;virtual void SetB(College *b)=0;protected:Mediator(){}virtual ~Mediator(){}};class ConcreateMediator:public Mediator{public:virtual void ActionAToB();virtual void ActionBToA();ConcreateMediator();ConcreateMediator(College *a,College *b);virtual void SetA(College *a);virtual void SetB(College *b);private:College *_a,*_b;};class College{public:void SetState(const string &str){state=str;}string GetState(){return state;} virtual void Action()=0;//信息同步void SetMediator(Mediator *med){mediator=med;}protected:College(Mediator *med,string str){mediator=med;state=str;}College(){}virtual ~College(){}Mediator *mediator;private:string state;};class ConcreateCollege1:public College{public:virtual void Action(){mediator->ActionAToB();}ConcreateCollege1(Mediator *med,string str):College(med,str){}ConcreateCollege1(){}~ConcreateCollege1(){}};class ConcreateCollege2:public College{public:virtual void Action(){mediator->ActionBToA();}ConcreateCollege2(Mediator *med,string str):College(med,str){}ConcreateCollege2(){}~ConcreateCollege2(){}};void ConcreateMediator::ActionAToB(){cout<<"A,B的状态:"<<_a->GetState()<<","<<_b->GetState()<<endl;_b->SetState(_a->GetState());cout<<"切换后A,B的状态:"<<_a->GetState()<<","<<_b->GetState()<<endl;}void ConcreateMediator::ActionBToA(){cout<<"A,B的状态:"<<_a->GetState()<<","<<_b->GetState()<<endl;_a->SetState(_b->GetState());cout<<"切换后A,B的状态:"<<_a->GetState()<<","<<_b->GetState()<<endl;}ConcreateMediator::ConcreateMediator(){}ConcreateMediator::ConcreateMediator(College *a,College *b){_a=a;_b=b;}void ConcreateMediator::SetA(College *a){_a=a;}void ConcreateMediator::SetB(College *b){_b=b;}void main(){College *college1=new ConcreateCollege1;College *college2=new ConcreateCollege2;Mediator *mediator=new ConcreateMediator(college1,college2);college1->SetMediator(mediator);college2->SetMediator(mediator);college1->SetState("HELLO");college1->Action();college2->SetState("GOGO");college2->Action();}