设计模式之中介者模式
【定义】中介者模式(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; }
【运行结果】
不积跬步无以至千里,不积小流无以成江河。