#include <string>
#include <iostream>
#include <map>
#include <vector>
class Module;
class Mediator
{
public:
virtual void toMediator(std::string msg, Module * p) = 0;
};
class Module
{
protected:
Mediator * m_mediator;
public:
Module(Mediator * p)
{
m_mediator = p;
}
virtual void toMediator(std::string msg) = 0;
virtual void toModule(std::string msg) = 0;
};
class ConcreteModule_0 : public Module
{
public:
ConcreteModule_0(Mediator * p) : Module(p) {}
void toMediator(std::string msg)
{
m_mediator->toMediator(msg, this);
}
void toModule(std::string msg)
{
std::cout << "Module_0 收到了消息:" << msg << std::endl;
std::cout << "Module_0回应:没呢,你呢?" << std::endl;
}
};
class ConcreteModule_1 : public Module
{
public:
ConcreteModule_1(Mediator * p) : Module(p) {}
void toMediator(std::string msg)
{
m_mediator->toMediator(msg, this);
}
void toModule(std::string msg)
{
std::cout << "Module_1 收到了消息:" << msg << std::endl;
std::cout << "Module_1回应:没呢,你呢?" << std::endl;
}
};
class ConcreteMediator : public Mediator
{
private:
std::map<Module *, Module *> m_p;
public:
void addModule(Module * p)
{
m_p[p] = p;
}
void toMediator(std::string msg, Module * p)
{
if ( 0 == m_p.count( p ) )
{
std::cout << "该模块未注册" << std::endl;
return;
}
std::cout << "中介者得到消息:" << msg << std::endl;
m_p[p]->toModule(msg);
}
};
int main()
{
ConcreteMediator * p = new ConcreteMediator();
std::vector<Module *> pListCol;
pListCol.push_back( new ConcreteModule_0(p) );
pListCol.push_back( new ConcreteModule_1(p) );
for ( size_t i=0; i < pListCol.size(); i++ )
{
p->addModule( pListCol[i] );
pListCol[i]->toMediator("你下班了吗?");
delete pListCol[i];
}
delete p;
return 0;
}