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

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值