首页 > 代码库 > 调停者模式

调停者模式

1,调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

技术分享

2,实例,我们的电脑cpu 内存,硬盘,光驱,都是通过主板互相连接起来如果去掉主板,那内存,光驱,硬盘都要互相连接cpu就很乱改变一个都会影响其他的.在我们开始实际中也是通过同事同事开发的东西互相独立不影响最后通过一个中间模块将其联结起来

技术分享

3,同是之间的协作代码:

// 调停者模式.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>


using namespace std;

class Colleague;

//调停者的抽象接口
class IMediator
{
public:
	virtual void changed(Colleague *c) = 0;

};

class Colleague{
	//持有一个调停者对象
private:
	IMediator *mediator;

public:
	string    m_name;
	Colleague(IMediator *mediator, string name){
		this->mediator = mediator;
		this->m_name = name;
	}
	/**
	* 获取当前同事类对应的调停者对象
	*/
	IMediator* getMediator() {
		return mediator;
	}
};


class ConcreteColleagueA :public Colleague{
public :
	ConcreteColleagueA(IMediator *mediator ,string name):Colleague(mediator,name){
	}
	/**
	* 示意方法,执行某些操作
	*/
	void operation(){
		//在需要跟其他同事通信的时候,通知调停者对象
		cout << "colleague a operation" << endl;
		getMediator()->changed(this);
	}
};


class ConcreteColleagueB :public Colleague{
public:
	ConcreteColleagueB(IMediator *mediator,string name) :Colleague(mediator,name){
	}
	/**
	* 示意方法,执行某些操作
	*/
	void operation(){
		//在需要跟其他同事通信的时候,通知调停者对象
		cout << "colleague b operation" << endl;
		getMediator()->changed(this);
	}
};


class ConcreteMediator :public IMediator{


private:
	ConcreteColleagueA *colleagueA;
	//持有并维护同事B
	ConcreteColleagueB *colleagueB;

public:
	void setColleagueA(ConcreteColleagueA *colleagueA) {
		this->colleagueA = colleagueA;
	}
	 void setColleagueB(ConcreteColleagueB *colleagueB) {
		this->colleagueB = colleagueB;
	}

	 void changed(Colleague *c) {
			/**
			* 某一个同事类发生了变化,通常需要与其他同事交互
			* 具体协调相应的同事对象来实现协作行为
			*/
		 cout << "who is notiy you:"<<c->m_name << endl;
		}
	
};

int _tmain(int argc, _TCHAR* argv[])
{
	ConcreteMediator * mediator = new ConcreteMediator();

	ConcreteColleagueA *colleagueA = new ConcreteColleagueA(mediator,"a");
	ConcreteColleagueB *colleagueB = new ConcreteColleagueB(mediator,"b");

	mediator->setColleagueA(colleagueA);
	mediator->setColleagueB(colleagueB);

	colleagueA->operation();

	cin.get();

	return 0;
}

4,调停者模式通过把多个同事对象之间的交互封装到调停者对象里面,从而使得同事对象之间松散耦合,基本上可以做到互补依赖。这样一来,同事对象就可以独立地变化和复用,而不再像以前那样“牵一处而动全身”了。

5,多个同事对象的交互,被封装在调停者对象里面集中管理,使得这些交互行为发生变化的时候,只需要修改调停者对象就可以了,当然如果是已经做好的系统,那么就扩展调停者对象,而各个同事类不需要做修改。

调停者模式