设计模式 笔记 中介者模式 Mediator

//---------------------------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
void WidgetChanged(Widget*) =0;

protected:

DialogDirector();

virtual
void CreateWidgets() =0;

};

//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 ...

}

时间: 2024-11-03 10:17:54

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

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

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

二十三种设计模式[17] - 中介者模式(Mediator Pattern)

前言 在开发软件的过程中,我们通常会将类设计的比较单纯,使其复用性更高.但类间的相互引用又使得类本身在没有其他类的支持下不能正常工作,导致其复用性降低.所以为了提高类的复用性我们需要尽可能的减少对其它类的引用,也就是说我们常说的解耦.中介者模式,顾名思义,就是存在一个类似中介的角色,类与类之间不直接交互而是通过中介进行间接的交互,也就意味着类与类之间不需要存在显示的引用,以达到松耦合的目的. 中介者模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为"

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

一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在,这场交易才变得如此方便. 在软件的开发过程中,势必会碰到这样一种情况,多个类或多个子系统相互交互,而且交互很繁琐,导致每个类都必须知道他需要交互的类,这样它们的耦合会显得异常厉害.牵一发而动全身,后果很严重,大熊很生气!~~~~(>_<)~~~~  好了,既然问题提出来了,那有请我们这期的主角-

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

前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌! 应用场景 1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式. 2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时. 3 想创造一个运行于多个类之间的对象,又不想生成新

设计模式之中介者模式 Mediator

代码实现 public interface Mediator { void register(String dname,Department d); void command(String dname); } 中介者接口 /* * 同事类接口 */ public interface Department { void selfAction(); //做本部门工作 void outAction(); //向总经理发出申请 } 同事类接口 public class Development imple

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中. 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系.虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能

设计模式之中介者模式20170731

行为型设计模式之中介者模式: 一.含义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 同事角色与其他同时角色通信的时候,一定要通过中介者角色(中介者封装了各个同事类之间的逻辑关系) 二.代码说明 1.主要有两个角色 1)中介者角色 通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色. 2)同事角色 每一个同事角色都知道中介者角色,而且与其他的同事角色通信的时候,一定要通过中介者角色协作. 每个同事类的行为分

【设计模式】——中介者模式

中介者模式(Mediator),用一个中介者对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互. Colleague叫做抽象同事类,而ConcreteColleague是具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接

折腾Java设计模式之中介者模式

博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. 通俗点来讲就是提供一个中介平台,说到平台,那其实很容易联系到我们很熟悉的房地产中介.我们可以直接通过这个平台得到我们想要的信息,不用对象自身与其他对象交互. 买房子租房子就不需要去找房东,只需要在中介那里获取相应的×××信息.如下图那样,两方只