中介者模式(Mediator)定义一个对象封装一系列多个对象如何相互作用,使得对象间不需要显式地相互引用,从而使其耦合更加松散,并且还让我们可以独立变化多个对象相互作用。结构图如下:
以一个聊天室的例子进行说明,一个聊天室可以很多成员,成员可以加入不同的讨论组,聊天室就是一个中介,讨论组中的成员通过聊天室发送消息。结构图如下:
实现代码:
//IChatroom.h
class User;
class IChatroom
{
public:
IChatroom();
virtual ~IChatroom();
virtual void Register(User*) = 0;
virtual void Send(char* pFrom, char* pTo, char* pMsg) = 0;
};
//IChatroom.cpp
#include "stdafx.h"
#include "IChatroom.h"
IChatroom::IChatroom()
{
}
IChatroom::~IChatroom()
{
}
//Chatroom.h
#include "IChatroom.h"
#include <map>
using namespace std;
class Chatroom : public IChatroom
{
public:
Chatroom();
virtual ~Chatroom();
void Register(User*);
void Send(char* pFrom, char* pTo, char* pMsg);
private:
map<char*, User*> m_mapUsers;
};
//Chatroom.cpp
#include "stdafx.h"
#include "Chatroom.h"
#include "User.h"
Chatroom::Chatroom()
{
}
Chatroom::~Chatroom()
{
}
void Chatroom::Register(User* pUser)
{
char* a = pUser->m_pName;
if(m_mapUsers[pUser->m_pName] == NULL)
{
m_mapUsers[pUser->m_pName] = pUser;
}
pUser->SetChatroom(this);
}
void Chatroom::Send(char* pFrom, char* pTo, char* pMsg)
{
User* pUserTo = (User*)m_mapUsers[pTo];
if(pUserTo != NULL)
{
pUserTo->Receive(pFrom, pMsg);
}
}
//User.h
class Chatroom;
class User
{
public:
User(char*);
virtual ~User();
void Send(char* pTo, char* pMsg);
virtual void Receive(char* pFrom, char* pMsg);
void SetChatroom(Chatroom*);
friend class Chatroom;
private:
char* m_pName;
Chatroom* m_pChatroom;
};
//User.cpp
#include "stdafx.h"
#include "User.h"
#include "Chatroom.h"
#include <iostream>
using namespace std;
User::User(char* pName)
{
m_pName = pName;
}
User::~User()
{
if(m_pChatroom != NULL)
{
delete m_pChatroom;
m_pChatroom = NULL;
}
}
void User::Send(char* pTo, char* pMsg)
{
m_pChatroom->Send(m_pName, pTo, pMsg);
}
void User::SetChatroom(Chatroom* pChatroom)
{
m_pChatroom = pChatroom;
}
void User::Receive(char* pFrom, char* pMsg)
{
cout << pFrom << " to " << this->m_pName << ":" << pMsg << endl;
}
//UserInGroupA.h
#include "User.h"
class UserInGroupA : public User
{
public:
UserInGroupA(char*);
virtual ~UserInGroupA();
virtual void Receive(char* pFrom, char* pMsg);
};
//UserInGroupA.cpp
#include "stdafx.h"
#include "UserInGroupA.h"
#include <iostream>
using namespace std;
UserInGroupA::UserInGroupA(char* pName) : User(pName)
{
}
UserInGroupA::~UserInGroupA()
{
}
void UserInGroupA::Receive(char* pFrom, char* pMsg)
{
cout << "组A成员收到消息-";
User::Receive(pFrom, pMsg);
}
//UserInGroupB.h
#include "User.h"
class UserInGroupB : public User
{
public:
UserInGroupB(char*);
virtual ~UserInGroupB();
virtual void Receive(char* pFrom, char* pMsg);
};
//UserInGroupB.cpp
#include "stdafx.h"
#include "UserInGroupB.h"
#include <iostream>
using namespace std;
UserInGroupB::UserInGroupB(char* pName) : User(pName)
{
}
UserInGroupB::~UserInGroupB()
{
}
void UserInGroupB::Receive(char* pFrom, char* pMsg)
{
cout << "组B成员收到消息-";
User::Receive(pFrom, pMsg);
}
//main.cpp
#include "stdafx.h"
#include "Chatroom.h"
#include "UserInGroupA.h"
#include "UserInGroupB.h"
int main(int argc, char* argv[])
{
Chatroom* pChatroom = new Chatroom;
User* pUserA = new UserInGroupA("UserA");
User* pUserB = new UserInGroupA("UserB");
User* pUserC = new UserInGroupB("UserC");
pChatroom->Register(pUserA);
pChatroom->Register(pUserB);
pChatroom->Register(pUserC);
pUserA->Send("UserB", "你好,UserB");
pUserB->Send("UserC", "你好,UserC");
pUserC->Send("UserA", "你好,UserA");
return 0;
}
class User;
class IChatroom
{
public:
IChatroom();
virtual ~IChatroom();
virtual void Register(User*) = 0;
virtual void Send(char* pFrom, char* pTo, char* pMsg) = 0;
};
//IChatroom.cpp
#include "stdafx.h"
#include "IChatroom.h"
IChatroom::IChatroom()
{
}
IChatroom::~IChatroom()
{
}
//Chatroom.h
#include "IChatroom.h"
#include <map>
using namespace std;
class Chatroom : public IChatroom
{
public:
Chatroom();
virtual ~Chatroom();
void Register(User*);
void Send(char* pFrom, char* pTo, char* pMsg);
private:
map<char*, User*> m_mapUsers;
};
//Chatroom.cpp
#include "stdafx.h"
#include "Chatroom.h"
#include "User.h"
Chatroom::Chatroom()
{
}
Chatroom::~Chatroom()
{
}
void Chatroom::Register(User* pUser)
{
char* a = pUser->m_pName;
if(m_mapUsers[pUser->m_pName] == NULL)
{
m_mapUsers[pUser->m_pName] = pUser;
}
pUser->SetChatroom(this);
}
void Chatroom::Send(char* pFrom, char* pTo, char* pMsg)
{
User* pUserTo = (User*)m_mapUsers[pTo];
if(pUserTo != NULL)
{
pUserTo->Receive(pFrom, pMsg);
}
}
//User.h
class Chatroom;
class User
{
public:
User(char*);
virtual ~User();
void Send(char* pTo, char* pMsg);
virtual void Receive(char* pFrom, char* pMsg);
void SetChatroom(Chatroom*);
friend class Chatroom;
private:
char* m_pName;
Chatroom* m_pChatroom;
};
//User.cpp
#include "stdafx.h"
#include "User.h"
#include "Chatroom.h"
#include <iostream>
using namespace std;
User::User(char* pName)
{
m_pName = pName;
}
User::~User()
{
if(m_pChatroom != NULL)
{
delete m_pChatroom;
m_pChatroom = NULL;
}
}
void User::Send(char* pTo, char* pMsg)
{
m_pChatroom->Send(m_pName, pTo, pMsg);
}
void User::SetChatroom(Chatroom* pChatroom)
{
m_pChatroom = pChatroom;
}
void User::Receive(char* pFrom, char* pMsg)
{
cout << pFrom << " to " << this->m_pName << ":" << pMsg << endl;
}
//UserInGroupA.h
#include "User.h"
class UserInGroupA : public User
{
public:
UserInGroupA(char*);
virtual ~UserInGroupA();
virtual void Receive(char* pFrom, char* pMsg);
};
//UserInGroupA.cpp
#include "stdafx.h"
#include "UserInGroupA.h"
#include <iostream>
using namespace std;
UserInGroupA::UserInGroupA(char* pName) : User(pName)
{
}
UserInGroupA::~UserInGroupA()
{
}
void UserInGroupA::Receive(char* pFrom, char* pMsg)
{
cout << "组A成员收到消息-";
User::Receive(pFrom, pMsg);
}
//UserInGroupB.h
#include "User.h"
class UserInGroupB : public User
{
public:
UserInGroupB(char*);
virtual ~UserInGroupB();
virtual void Receive(char* pFrom, char* pMsg);
};
//UserInGroupB.cpp
#include "stdafx.h"
#include "UserInGroupB.h"
#include <iostream>
using namespace std;
UserInGroupB::UserInGroupB(char* pName) : User(pName)
{
}
UserInGroupB::~UserInGroupB()
{
}
void UserInGroupB::Receive(char* pFrom, char* pMsg)
{
cout << "组B成员收到消息-";
User::Receive(pFrom, pMsg);
}
//main.cpp
#include "stdafx.h"
#include "Chatroom.h"
#include "UserInGroupA.h"
#include "UserInGroupB.h"
int main(int argc, char* argv[])
{
Chatroom* pChatroom = new Chatroom;
User* pUserA = new UserInGroupA("UserA");
User* pUserB = new UserInGroupA("UserB");
User* pUserC = new UserInGroupB("UserC");
pChatroom->Register(pUserA);
pChatroom->Register(pUserB);
pChatroom->Register(pUserC);
pUserA->Send("UserB", "你好,UserB");
pUserB->Send("UserC", "你好,UserC");
pUserC->Send("UserA", "你好,UserA");
return 0;
}
最后输出:
组A成员收到消息-UserA to UserB:你好,UserB
组B成员收到消息-UserB to UserC:你好,UserC
组A成员收到消息-UserC to UserA:你好,UserA