//---------------------------15/04/27----------------------------

//Mediator 中介者模式----对象行为型模式

/*

1:意图:

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,

而且可以独立地改变它们之间的交互。

2:动机:

3:适用性:

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

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

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

4:结构:

Colleague:

Mediator:<-------------------------------mediator

|                                       |

|                               ------------------

ConreteMediator:                    |                |

concreteColleague1------------->ConcreteColleague1: ConcreteColleague2:<---------|

concreteColleague2---------------------------------------------------------------|

5:参与者:

1>Mediator:

中介者定义一个接口用于与各同事对象通信。

2>ConcreteMediator:

1)具体中介者通过协调各同事对象实现协作行为。

2)了解并维护他的各个同事。

3>Colleague:

同事中存放了中介者对象,定义了与之通信的接口。

4>ConcreteColleague:

在想与其他同事通信的时候,只需与中介者通信即可。

6:协作:

同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。

7:效果:

1>优点:

1)减少子类生成:

Mediator讲原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Mediator的子类即可。

这样各个Colleague类可被重用。

2)它将各个Colleague解耦:

Mediator有利于各个Colleague间的松耦合,你可以独立地改变和复用各Colleague类和Mediator类。

3)它简化了对象协议:

用Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和

扩展。

4)它对对象如何协作进行了抽象:

将中介作为一个独立的概念并将其封装在一个对象中,使你讲注意力从对象各自本身的行为转移到它们

之间的交互上来,这有助于弄清楚一个系统中的对象是如何交互的。

2>缺点:

它使控制集中化:

中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任何一个Colleague

都复杂,这可能使得中介者变成一个难以维护的庞然大物。

8:实现:

1>忽略抽象的Mediator类:

当各Colleague仅与一个Mediator一起工作时,没有必要定义一个抽象的Mediator类。Mediator类提供的抽象

耦合已经使各Colleague可与不同的Mediator子类一起工作。

2>Colleague--Mediator通信:

当一个感兴趣的事件发生时,Colleague必须与其Mediator通信。一种实现方法是使用观察者模式,将Mediator

实现为一个Observer,各Colleague作为Subject。一旦状态改变就发送通知给Mediator。Mediator做出的

响应是将状态改变的结果传播给其他的Colleague。

9:代码示例:                                                                             */

//Mediator:

class DialogDirector

{

virtual ~DialogDirector();

virtual
void ShowDialog();

virtual
;

protected:

DialogDirector();

virtual
;

};

//Colleague:

class Widget

{

public:

Widget(DialogDirector*);

virtual
void Changed();

virtual
void HandleMouse(MouseEvent& event);

private:

DialogDirector* _director;

};

//通知Mediator自己改变了

void Widget::Changed()

{

_director->WidgetChanged(this);

}

class ListBox :public Widget

{

public:

ListBox(DialogDirector*);

virtual
constchar* GetSelection();

virtual
void SetList(List<char*>* listItems);

virtual
void HandleMouse(MouseEvent& event);

};

class EntryField :public Widget

{

public:

EntryField(DialogDirector*);

virtual
void SetText(constchar* text);

virtual
constchar* GetText();

virtual
void HandleMouse(MouseEvent& event);

};

class Button :public Widget

{

public:

Button(DialogDirector*);

virtual
void SetText(constchar* text);

virtual
void HandleMouse(MouseEvent& event);

};

void Button::HandleMouse(MouseEvent& event)

{

Changed();

}

//ConcreteMediator:

class FontDialogDirector :public DialogDirector

{

public:

FontDialogDirector();

virtual ~FontDialogDirector();

virtual
void WidgetChanged(Widget*);

protected:

virtual
void CreateWidgets();

private:

Button* _ok;

Button* _cancel;

ListBox* _fontList;

EntryField* _fontName;

};

void FontDialogDirector::CreateWidgets()

{

_ok =new Button(this);

_cancel =new Button(this);

_fontList =new ListBox(this);

_fontName =new EntryField(this);

}

//使用if判断是哪个对象改变了,然后做出相应的操作,这里的信心只有改变,如果想

//更具体可以在这个接口上增加一个参数,传入相应信息。

void FontDialogDirector::WidgetChanged(Widget* theChangedWidget)

{

if(theChangedWidget == _fontList)

{

_fontName->SetText(_fontList->GetSelection());

}

else
if (theChangedWidget == _ok)

{

...

}

else ...

}

设计模式 笔记 中介者模式 Mediator的更多相关文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 二十四种设计模式:中介者模式(Mediator Pattern)

    中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...

  3. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  4. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  5. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

  6. 学习笔记——中介者模式Mediator

    中介者模式,A与B之间存在调用对方操作的行为,通过中介者模式,可以去除双方的强引用.如图,A可以通过代理Mediator的方法来调用B的方法,而不需要保存B的引用.

  7. 行为型设计模式之中介者模式(Mediator)

    结构 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 一组对象以定义良好但是复杂的方式进行通信.产生的相互 ...

  8. 【设计模式】—— 中介者模式Mediator

    前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...

  9. 设计模式之中介者模式(Mediator)

    中间者模者模式原理:中介者维持所有要交互对象的指针或者对象,所有对象维持一个中介者的指针或者对象. #include <iostream> #include <string> ...

随机推荐

  1. Python学习---Python环境变量安装问题0907

    问题背景: 重新安装操作系统后,原来的环境变量丢失[因Python3.5安装目录是E盘,文件还在,只是丢失了环境变量而已,添加即可] 问题解决: 方法一:使用cmd命令添加path环境变量 在cmd下 ...

  2. Go语言学习笔记(六)net & net/http

    加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 net import "net" net包提供了可移植的网络I/O接口,包括TCP/IP.UD ...

  3. SDN期末作业博客

    一.项目描述 A P4-based Network Load Balancing Application 基于P4的网络负载均衡项目 二.个人分工 The Controller : Acquire t ...

  4. vue2.0模拟锚点

    在vue项目中,因为采用路由跳转,会导致无法使用常规的a标签配合ID的锚点功能. 解决办法: <a href="javascript:void(0)" @click=&quo ...

  5. 2879: [Noi2012]美食节

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  6. eclipse中文版官方下载

    目前eclipse的使用已经越来越广泛,它不仅应用于Java开发中,对于C++开发.php开发的程序员们也是非常喜爱.eclipse中文版下载其实是eclipse官方网站提供的中文包,默认情况下ecl ...

  7. 微信发红包 PHP 实现

    最近做生日营销,需要微信发红包,特此从网上找了一篇教程 首先你的有个服务号,并且开通了微信支付,我在这就不说怎么去申请和开通了,我是看了微信官方文档后,想看官方文档的朋友可以到下面这个链接 https ...

  8. Python高级网络编程系列之基础篇

    一.Socket简介 1.不同电脑上的进程如何通信? 进程间通信的首要问题是如何找到目标进程,也就是操作系统是如何唯一标识一个进程的! 在一台电脑上是只通过进程号PID,但在网络中是行不通的,因为每台 ...

  9. WorldWind源码剖析系列:枚举类型

    PluginSDK中的枚举型主要有以下这些: public enum AltitudeMode//高度模式枚举 { ClampedToGround,//强制到地面模式 RelativeToGround ...

  10. PAT B1013 数素数 (20 分)

    令 P​i​​ 表示第 i 个素数.现任给两个正整数 M≤N≤10​4​​,请输出 P​M​​ 到 P​N​​ 的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格式: 输 ...