[行为型模式] 中介者模式的理解

[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=13770720612900357&size=800_600&devtype=web&v=1.0.1&rtick=14676146429780&share_qid=108635719&sign=f3a44f394170f80f34fc15d522261fb2&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145729453968&size=800_600&devtype=web&v=1.0.1&rtick=14676146458401&share_qid=108635719&sign=ff2f079b295de3662d013ae897afb1e3&[/img]
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676145739458187&size=800_600&devtype=web&v=1.0.1&rtick=14676146451509&share_qid=108635719&sign=cc1c1e5e61090abf73fb00c58f9db2a2&[/img]

[color=red][b]头文件[/b][/color]

//MediatorPattern.h

#ifndef MEDIATOR_PATTERN_H
#define MEDIATOR_PATTERN_H

#include <Windows.h>
#include <iostream>
using namespace std;

namespace MediatorPattern
{
class Mediator;
class Colleague
{
public:
Colleague(Mediator* pMediator);
virtual void Send(const char* pszMsg) = 0;
virtual void Notify(const char* pszMsg) = 0;

protected:
Mediator* m_pMediator;
};

class ConcreteColleagueA : public Colleague
{
public:
ConcreteColleagueA(Mediator* pMediator);
virtual void Send(const char* pszMsg);
virtual void Notify(const char* pszMsg);
};

class ConcreteColleagueB : public Colleague
{
public:
ConcreteColleagueB(Mediator* pMediator);
virtual void Send(const char* pszMsg);
virtual void Notify(const char* pszMsg);
};

//
class Mediator
{
public:
virtual void Send(const char* pszMsg, Colleague* pColleague) = 0;
};

class ConcreteMediator : public Mediator
{
public:
virtual void Send(const char* pszMsg, Colleague* pColleague);

void SetColleagueA(Colleague* pColleague);
void SetColleagueB(Colleague* pColleague);

private:
// The Mediator knows all the Colleague
ConcreteColleagueA* m_pConcreteColleagueA;
ConcreteColleagueB* m_pConcreteColleagueB;
};

//
void MediatorPattern_Test();
}

#endif


[color=red][b]实现[/b][/color]

#include "MediatorPattern.h"
#include <iostream>
using namespace std;

#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }

namespace MediatorPattern
{
//
Colleague::Colleague(Mediator* pMediator)
: m_pMediator(pMediator)
{
cout << "Colleague::Colleague" << endl;
}

//
ConcreteColleagueA::ConcreteColleagueA(Mediator* pMediator)
: Colleague(pMediator)
{
cout << "ConcreteColleagueA::ConcreteColleagueA" << endl;
}

void ConcreteColleagueA::Send(const char* pszMsg)
{
cout << "ConcreteColleagueA::Send" << endl;
cout << "Send request to Mediator:" << pszMsg << endl;
m_pMediator->Send(pszMsg, this);
}

void ConcreteColleagueA::Notify(const char* pszMsg)
{
cout << "ConcreteColleagueA::Notify " << endl;
cout << "Receive response from Mediator:" << pszMsg << endl;
}

//
ConcreteColleagueB::ConcreteColleagueB(Mediator* pMediator)
: Colleague(pMediator)
{
cout << "ConcreteColleagueA::ConcreteColleagueB" << endl;
}

void ConcreteColleagueB::Send(const char* pszMsg)
{
cout << "ConcreteColleagueB::Send" << endl;
cout << "Send request to Mediator:" << pszMsg << endl;
m_pMediator->Send(pszMsg, this);
}

void ConcreteColleagueB::Notify(const char* pszMsg)
{
cout << "ConcreteColleagueB::Notify " << endl;
cout << "Receive response from Mediator:" << pszMsg << endl;
}

//
void ConcreteMediator::Send(const char* pszMsg, Colleague* pColleague)
{
cout << "ConcreteMediator::Send -> GetMessage:" << pszMsg << endl;

ConcreteColleagueA* pTemp = dynamic_cast<ConcreteColleagueA*>(pColleague);
if (NULL == pTemp)
{
cout<<"The message is from ConcreteColleagueA. Now mediator forward it to ConcreteColleagueB"<<endl;
if (m_pConcreteColleagueB != NULL)
{
pTemp->Notify("[ConcreteColleagueB]ConcreteMediator::Send->Notify");
}
}
else
{
if (m_pConcreteColleagueA != NULL)
{
pTemp->Notify("[ConcreteColleagueA]ConcreteMediator::Send->Notify");
}
}
}

void ConcreteMediator::SetColleagueA(Colleague* pColleague)
{
m_pConcreteColleagueA = dynamic_cast<ConcreteColleagueA*>(pColleague);
}

void ConcreteMediator::SetColleagueB(Colleague* pColleague)
{
m_pConcreteColleagueB = dynamic_cast<ConcreteColleagueB*>(pColleague);
}

//
void MediatorPattern_Test()
{
// Create the mediator
Mediator *pMediator = new ConcreteMediator();

Colleague *pColleague1 = new ConcreteColleagueA(pMediator);
Colleague *pColleague2 = new ConcreteColleagueB(pMediator);

ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);
pConcreteMediator->SetColleagueA(pColleague1);
pConcreteMediator->SetColleagueB(pColleague2);

char message[260] = "Where are you from?";
pColleague1->Send(message);
}
}


[color=red][b]客户端[/b][/color]

#include "MediatorPattern.h"

#include <iostream>
#include <sstream>
#include <string>
#include <list>
using namespace std;
using namespace VisitorPattern;

void main()
{
MediatorPattern_Test();
}


运行结果
[img]https://api5.yunpan.360.cn/intf.php?method=Share.getPublicThumbByNid&qid=108635719&nid=14676146009499695&size=800_600&devtype=web&v=1.0.1&rtick=14676146459089&share_qid=108635719&sign=33525efca1b084be76d663c4efe55a37&[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值