设计模式笔记--行为型模式之五--中介者

意图:

用一个中介对象来封装一系列对象交互.中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互

适用性:

1一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解

2一组对象引用其它很多对象并且直接与这些对象通信,导致难以复用该对象

3想定制一个分布在多个类中的行为,而又不想生成太多的子类

 

效果:

1减少了子类生成。Mediator将原来分布于多个对象间的行为集中在一起。改变这些行为只需要生成Mediator的子类即可

2它将各Colleague解耦。有利于各Colleague间的松耦合。可以独立的改变和复用各Colleague类和Mediator

3简化了对象协议。用Mediator和各Colleague间的一对多的交互来代替多对多的交互

4对对象如何协作进行了抽象 将中介作为一个独立的概念并将其封装在一个对象中,有助于弄清一个系统中的对象是如何交互的。

5控制集中化 中介者模式将交互的复杂性变为中介者的复杂性

 

实现:

1忽略抽象的Mediator  当各Colleague仅与一个Mediator工作时,没有必要定义一个抽象的Mediator

2 Colleague-Mediator通信 有两种方式

 a Observer模式,将Mediator实现为一个Observer,Colleague作为Subject,一旦其状态改变就发送通知给Mediator

b Mediator中定义一个特殊的通知接口,各Colleague通信时直接调用该接口

 

The code is as below:

Mediator.h

  1. #include <iostream>
  2. using namespace std;
  3. class Widget;
  4. class DialogDirector
  5. {
  6. public:
  7.     virtual ~DialogDirector() {cout<<"Destory DialogDirector"<<endl;}
  8.     //virtual void ShowDialog();
  9.     virtual void WidgetChanged(Widget*) = 0;
  10. protected:
  11.     DialogDirector() {cout<<"Create DialogDirector"<<endl;}
  12.     virtual void CreateWidgets() {cout<<"Create Widgets"<<endl;}
  13. };
  14. class Widget
  15. {
  16. public:
  17.     Widget(DialogDirector* s) 
  18.     {
  19.         _director=s;
  20.         cout<<"Create Widget"<<endl;
  21.     }
  22.     virtual void Changed()
  23.     {
  24.         _director->WidgetChanged(this);
  25.     }
  26. //  virtual void HandleMouse(MouseEvent& event);
  27. private:
  28.     DialogDirector* _director;
  29. };
  30. class ListBox : public Widget
  31. {
  32. public:
  33.     ListBox(DialogDirector* s): Widget(s) {cout<<"Create ListBox."<<endl;}
  34.     //virtual const char* GetSelection();
  35.     //virtual void  SetList
  36.     virtual void HandleMouse()
  37.     {
  38.         Changed();
  39.     }
  40. };
  41. class EntryField : public Widget
  42. {
  43. public:
  44.     EntryField(DialogDirector* s): Widget(s) {cout<<"Create EntryField."<<endl;}
  45.   //virtual void SetText(const char* text);
  46.  // virtual const char* GetText();
  47.   virtual void HandleMouse()
  48.   {
  49.         Changed();
  50.   }
  51. };
  52. class Button: public Widget
  53. {
  54. public:
  55.     Button(DialogDirector* s): Widget(s) {cout<<"Create Button."<<endl;}
  56.     //virtual void SetText(const char* text);
  57.     virtual void HandleMouse()
  58.     {
  59.         Changed();
  60.     }
  61. };
  62. class FontDialogDirector : public DialogDirector
  63. {
  64. public:
  65.     FontDialogDirector() {cout<<"Create FontDialogDirector."<<endl;}
  66.     virtual ~FontDialogDirector() {cout<<"Destory FontDialogDirector."<<endl;}
  67.     virtual void WidgetChanged(Widget*);
  68.     virtual void CreateWidgets(Button* s ,Button* t,ListBox* r, EntryField* w);
  69.     Button* _ok;
  70.     Button* _cancel;
  71.     ListBox* _fontlist;
  72.     EntryField* _fontName;
  73. };

 

Mediator.cpp

 

  1. #include <iostream>
  2. using namespace std;
  3. #include "Mediator.h"
  4. void FontDialogDirector::CreateWidgets(Button* s ,Button* t,ListBox* r,EntryField* w)
  5. {
  6.     _ok = new Button(this);
  7.     _cancel = new Button(this);
  8.     _fontlist = new ListBox(this);
  9.     _fontName = new EntryField(this);
  10.      s = _ok;
  11.     t = _cancel;
  12.     r = _fontlist;
  13.     w = _fontName;
  14. }
  15. void FontDialogDirector::WidgetChanged(Widget* theChangedWidget)
  16. {
  17.     if (theChangedWidget == _fontlist)
  18.     {
  19.         cout<<"The font  is changed in font list ."<<endl;
  20.     }
  21.     if (theChangedWidget == _ok)
  22.     {
  23.         cout<<"Change the Font and dismiss the dialog."<<endl;
  24.     }
  25.     if (theChangedWidget == _cancel)
  26.     {
  27.         cout<<"Dismiss the dialog."<<endl;
  28.     }
  29. }

main.cpp

  1. #include "Mediator.h"
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6.     FontDialogDirector a;
  7.     Button* ok;
  8.     Button* cancel;
  9.     ListBox* fontlist;
  10.     EntryField* fontName;
  11.     a.CreateWidgets(ok,cancel,fontlist,fontName);
  12.     (a._ok)->HandleMouse();
  13.     
  14.     return 0;
  15. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值