设计模式之中介者模式

【定义】中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互应用,从而使其耦合松散,而且可以独立的改变它们之间的交互。

【场景】一个窗口中有两个控件,一个按钮Button和编辑框Label,现在要单机按钮则编辑框改变文本,如果将编辑框改变文本的代码放到按钮的单机事件处理函数里面,那这两个对象便是耦合的。现在可以将窗口Window作为一个中介者,让按钮跟窗口交互,然后窗口再跟编辑框交互,这样就接触了按钮和编辑框之间的相互影响了。

【UML】


【Code】

#include <iostream>

using namespace std;

class Mediator;
class Widget
{
protected:
	Mediator* mediator;
public:
	Widget(Mediator* m):mediator(m){}
	virtual void send(int msg_id) = 0;
	virtual void notify(int msg_id) = 0;
};

class Mediator
{
public:
	virtual void send(int msg_id, Widget* w) = 0;
};

class Button : public Widget
{
public:
	Button(Mediator* m):Widget(m){}
	void send(int msg_id)
	{
		mediator->send(msg_id, this);
	}
	void notify(int msg_id)
	{
		cout<<"Button receive msg:"<<msg_id<<endl;
	}
};

class Label : public Widget
{
public:
	Label(Mediator* m):Widget(m){}
	void send(int msg_id)
	{
		mediator->send(msg_id, this);
	}
	void notify(int msg_id)
	{
		cout<<"Label receive msg:"<<msg_id<<endl;
	}
};

class Window : public Mediator
{
private:
	Widget* btn;
	Widget* label;
public:
	void set_widget(Widget* b, Widget* l)
	{
		btn = b;
		label = l;
	}
	void send(int msg_id, Widget* w)
	{
		if(w == btn)
		{
			label->notify(msg_id);
		}
		if(w == label)
		{
			btn->notify(msg_id);
		}
	}
};

int main()
{
	Window* window = new Window;
	Widget* btn = new Button(window);
	Widget* label = new Label(window);

	window->set_widget(btn, label);
	btn->send(1005);
	label->send(2004);

	delete window;
	delete btn;
	delete label;

	return 0;
}


【运行结果】



posted @ 2012-08-26 19:17  $逝水无痕$  阅读(126)  评论(0编辑  收藏  举报