设计模式Mediator的C++实现源码

来源:互联网 发布:java telnet登录失败 编辑:程序博客网 时间:2024/06/05 02:02

1、抽象类Media定义

#ifndef MEDIATOR_H
#define MEDIATOR_H
#pragma warning(disable:4786)

#include <map>
#include <string>
#include "Colleague.h"
using namespace std;

class Colleague;
typedef pair<string, Colleague*> Init_Pair;

class Mediator
{
public:
 virtual void AddColleague(Colleague*);
 virtual void Notified(Colleague*) = 0;
 
protected:
 map<string,Colleague*> m_map;
};

#endif

 

2、抽象类Mediator实现

#include "Mediator.h"

void Mediator::AddColleague(Colleague* c)
{
 m_map.insert(Init_Pair(c->GetName(),c));
}

 

3、抽象类Colleague定义

#ifndef COLLEAGUE_H
#define COLLEAGUE_H

#include "Mediator.h"

class Mediator;

class Colleague
{
public:
 Colleague(Mediator*);
 ~Colleague();
 virtual void Changed();
 virtual void Action() = 0;
 virtual char* GetName() = 0;

private:
 Mediator* m_pm;
};

#endif

 

4、抽象类Colleague实现

#include "Colleague.h"

Colleague::Colleague(Mediator* media) : m_pm(media)
{

}

Colleague::~Colleague()
{

}

void Colleague::Changed()
{
 if(m_pm != NULL)
 {
  m_pm->Notified(this);
 }
}

 

5、具体类ConcreteMediator定义

#ifndef CONCRETEMEDIATOR_H
#define CONCRETEMEDIATOR_H

#include "Mediator.h"

class ConcreteMediator : public Mediator
{
public:
 ConcreteMediator();
 ~ConcreteMediator();
 void Notified(Colleague*);
};

#endif

 

6、具体类ConcreteColleague实现

#include "ConcreteMediator.h"

#define COLLEAGUE1 "ConcreteColleague1"
#define COLLEAGUE2 "ConcreteColleague2"
#define COLLEAGUE3 "ConcreteColleague3"

ConcreteMediator::ConcreteMediator()
{

}

ConcreteMediator::~ConcreteMediator()
{

}

void ConcreteMediator::Notified(Colleague* c)
{
 map<string,Colleague*>::const_iterator iter;
 if(!strcmp(c->GetName(),COLLEAGUE1))
 {
  printf("ConcreteColleague1 changed!/n");
  iter = m_map.find(COLLEAGUE2);
  iter->second->Action();
  iter = m_map.find(COLLEAGUE3);
  iter->second->Action();
 }
 else if(!strcmp(c->GetName(),COLLEAGUE2))
 {
  printf("ConcreteColleague2 changed!/n");
  iter = m_map.find(COLLEAGUE1);
  iter->second->Action();
  iter = m_map.find(COLLEAGUE3);
  iter->second->Action();
 }
 else if(!strcmp(c->GetName(),COLLEAGUE3))
 {
  printf("ConcreteColleague3 changed!/n");
  iter = m_map.find(COLLEAGUE1);
  iter->second->Action();
  iter = m_map.find(COLLEAGUE2);
  iter->second->Action();
 }
}

 

7、具体类ConcreteColleague1定义

#ifndef CONCRETECOLLEAGUE1_H
#define CONCRETECOLLEAGUE1_H

#include "Colleague.h"

class ConcreteColleague1 : public Colleague
{
public:
 ConcreteColleague1(Mediator*);
 ~ConcreteColleague1();
 char* GetName();
 void Action();
};

#endif

 

8、具体类ConcreteColleague1实现

#include "ConcreteColleague1.h"

ConcreteColleague1::ConcreteColleague1(Mediator* media) : Colleague(media)
{

}

ConcreteColleague1::~ConcreteColleague1()
{

}

char* ConcreteColleague1::GetName()
{
 return "ConcreteColleague1";
}

void ConcreteColleague1::Action()
{
 printf("ConcreteColleague1::Action()/n");
}

 

9、具体类ConcreteColleague2实现

#ifndef CONCRETECOLLEAGUE2_H
#define CONCRETECOLLEAGUE2_H

#include "Colleague.h"

class ConcreteColleague2 : public Colleague
{
public:
 ConcreteColleague2(Mediator*);
 ~ConcreteColleague2();
 char* GetName();
 void Action();
};

#endif

 

10、具体类ConcreteColleague2实现

#include "ConcreteColleague2.h"

ConcreteColleague2::ConcreteColleague2(Mediator* media) : Colleague(media)
{

}

ConcreteColleague2::~ConcreteColleague2()
{

}

char* ConcreteColleague2::GetName()
{
 return "ConcreteColleague2";
}

void ConcreteColleague2::Action()
{
 printf("ConcreteColleague2::Action()/n");
}

 

11、具体实现类ConcreteColleague3定义

#ifndef CONCRETECOLLEAGUE3_H
#define CONCRETECOLLEAGUE3_H

#include "Colleague.h"

class ConcreteColleague3 : public Colleague
{
public:
 ConcreteColleague3(Mediator*);
 ~ConcreteColleague3();
 char* GetName();
 void Action();
};

#endif

 

12、具体实现类ConcreteColleague3实现

#include "ConcreteColleague3.h"

ConcreteColleague3::ConcreteColleague3(Mediator* media) : Colleague(media)
{

}

ConcreteColleague3::~ConcreteColleague3()
{

}

char* ConcreteColleague3::GetName()
{
 return "ConcreteColleague3";
}

void ConcreteColleague3::Action()
{
 printf("ConcreteColleague3::Action()/n");
}

 

13、客户使用类Client实现

#include "Colleague.h"
#include "Mediator.h"
#include "ConcreteMediator.h"
#include "ConcreteColleague1.h"
#include "ConcreteColleague2.h"
#include "ConcreteColleague3.h"

int main()
{
 Mediator* md = new ConcreteMediator();
 Colleague* c1 = new ConcreteColleague1(md);
 Colleague* c2 = new ConcreteColleague2(md);
 Colleague* c3 = new ConcreteColleague3(md);
 md->AddColleague(c1);
 md->AddColleague(c2);
 md->AddColleague(c3);
 c1->Changed();
 c2->Changed();
 c3->Changed();

 delete c3;
 c3 =NULL;
 delete c2;
 c2 = NULL;
 delete c1;
 c1 = NULL;
 delete md;
 md = NULL;

 return 0;
}