设计模式之中介者模式

【定义】中介者模式(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;
}


【运行结果】



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值