设计模式 笔记 中介者模式 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
;
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的更多相关文章
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------中介者模式Mediator
一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...
- 学习笔记——中介者模式Mediator
中介者模式,A与B之间存在调用对方操作的行为,通过中介者模式,可以去除双方的强引用.如图,A可以通过代理Mediator的方法来调用B的方法,而不需要保存B的引用.
- 行为型设计模式之中介者模式(Mediator)
结构 意图 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 适用性 一组对象以定义良好但是复杂的方式进行通信.产生的相互 ...
- 【设计模式】—— 中介者模式Mediator
前言:[模式总览]——————————by xingoo 模式意图 使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合. 这个中介者常常起着中间桥梁的作用,使其他的对象可以利用 ...
- 设计模式之中介者模式(Mediator)
中间者模者模式原理:中介者维持所有要交互对象的指针或者对象,所有对象维持一个中介者的指针或者对象. #include <iostream> #include <string> ...
随机推荐
- Python基础一数据类型之数字类型
摘要: python基础一中提到了数据类型,这里主要讲解的是数字类型. 数字类型: 1,整型 2,长整型 3,浮点型 4,复数型 1,整型(int) 定义a = 1 通过type函数查看数据类型,整型 ...
- SQL Server Management Studio记住的密码丢失的问题
不知道各位经常使用SSMS的时候有没有碰到过这样的烦恼: 记住的密码总是丢失: 步骤如下: 登陆时,选择记住密码 在任何一个存储过程上点击右键,选择修改 这时候再次连接对象资源管理器时,刚刚记住的密码 ...
- python之demo1----改编自turtle.py文件中的demo
""" 改编自turtle.py自带demo 执行 python -m turtledemo 命令查看系统内置demo的源码 绘制:需要通过import turtle引入 ...
- setuid、setgid、sticky的权限简单用法
如何设置setuid.setgid.sticky的权限: setuid :置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S . chmod 4xxx file chmod u+s xx ...
- 【待补充】Spark 集群模式 && Spark Job 部署模式
0. 说明 Spark 集群模式 && Spark Job 部署模式 1. Spark 集群模式 [ Local ] 使用一个 JVM 模拟 Spark 集群 [ Standalone ...
- [Spark Core] Spark 在 IDEA 下编程
0. 说明 Spark 在 IDEA 下使用 Scala & Spark 在 IDEA 下使用 Java 编写 WordCount 程序 1. 准备 在项目中新建模块,为模块添加 Maven ...
- Beta 冲刺 (1/7)
Beta 冲刺 (1/7) 队名:洛基小队 峻雄(组长) 已完成:β版的初步计划 后两天计划:设计角色的技能树 剩余任务:角色的技能 困难:关于技能施放以及相关伤害计算等的代码 非易 已完成:角色交互 ...
- [python]如何理解uiautomator里面的 instance 及使用场景
通过uiautomatorviewer打开之后,需要通过对某个控件进行操作,但在当前界面中该控件所有属性无法唯一(其它控件属性也是一样),这个时候就需要借助实例(instance)来进行区分,inst ...
- Android SDK4/5/6/7,相册、拍照及裁剪功能及遇见的坑
保存照片和视频到系统相册显示- http://blog.csdn.net/chendong_/article/details/52290329 Android 7.0 之拍照与图片裁剪适配-http: ...
- 理解JavaScript中的作用域链
理解了作用域链,闭包就不难理解了,所以本文主要谈一谈我对作用域链的理解. 关于JavaScript中变量的作用域,全局变量在程序中始终都有定义.局部变量在声明它的函数体内以及其内部所嵌套的函数内始 ...