设计模式复习-中介者模式

#pragma once
#include "stdafx.h"
#include<map>
#include<set>
#include<string>
#include<iostream>
using namespace std;

/*
	设计模式-中介者模式(Mediator)
	用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要
显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
中介者模式的有点来自集中控制,其缺点也是他,中介者模式一般应用于一组对象
定义良好但是复杂的方式进行通讯的场合,以及想定制一个分布式在多个类中的行为,
而又不想生成太多的子类的场合。
*/

class CMediator {//抽象中介者
public:
	virtual void Send(const string &strPeople, const string &strMessage) = 0;
};

class CColleague {//抽象同事类
protected:
	CMediator *mpMediator;
public:
	CColleague(CMediator *pMediator) {
		mpMediator = pMediator;
	}
	virtual void Notify(const string &strMessage) = 0;
};

class CConcreteColleague1 :public CColleague {//同事类1
public:
	CConcreteColleague1(CMediator *pMediator) :CColleague(pMediator) {}
	void Send(const string &strPeople, const string &strMessage) {
		mpMediator->Send(strPeople , strMessage);
	}
	void Notify(const string &strMessage) {
		cout << "tong shi 1 de dao xin xi:" << strMessage << endl;
	}
};

class CConcreteColleague2 :public CColleague {//同事类2
public:
	CConcreteColleague2(CMediator *pMediator) :CColleague(pMediator) {}
	void Send(const string &strPeople, const string &strMessage) {
		mpMediator->Send(strPeople, strMessage);
	}
	void Notify(const string &strMessage) {
		cout << "tong shi 2 de dao xin xi:" << strMessage << endl;
	}
};

class CConcreteMediator :public CMediator {//具体中介者类
private:
	map<string, CColleague*>mpColleague;
public:
	CConcreteMediator() {mpColleague.clear();}
	void Send(const string &strPeople, const string &strMessage) {
		mpColleague[strPeople]->Notify(strMessage);
	}
	void AddColleague(const string &strPeople ,CColleague * pColleague) {
		mpColleague[strPeople] = pColleague;
	}
};


int main() {

	CConcreteMediator *pM = new CConcreteMediator();
	CConcreteColleague1 *pC1 = new CConcreteColleague1(pM);
	CConcreteColleague2 *pC2 = new CConcreteColleague2(pM);
	pM->AddColleague("pC1", pC1);
	pM->AddColleague("pC2", pC2);

	pC1->Send("pC2","chi fan mei?");
	pC2->Send("pC1", "mei ne");

	delete pM, delete pC1, delete pC2;

	getchar();
	return 0;
}

原文地址:https://www.cnblogs.com/csnd/p/12061906.html