//---------------------------15/04/17----------------------------

//Decorator 装饰模式----对象结构型模式

/*

1:意图:

动态地给一个对象添加额外的职业,就增加功能来说,Decorator模式相比生成子类更为灵活。

2:别名:

包装器(Wrapper)

3:动机:

4:适用性:

1>在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

2>处理那些可以撤销的职责。

3>当不能采用生成子类的方法进行扩充时:

1)可能有大量独立的扩展,为支持每一种组合将产生大量的子类。

2)类定义被隐藏,或类定义不能用于生成子类。

5:结构:

Component:<------------------

Operation                   |

|                       |

|                       |

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

|                |              |

ConcreteComponent:      Decorator:      |

Operation()             component--------

Operation()

{ component->Operation() }

|

|

--------------------

|                  |

ConcreteDecoratorA: ConcreteDecoratorB:

Operation()         Operatione()

addedState()        {   Decorator::Operation();

AddedBehavior();        }

AddedBehavior()

6:参与者:

1>Component

定义一个对象接口,可以给这些对象动态地添加职责。

2>ConcreteComponent

定义一个对象,可以给这个对象添加职责。

3>Decorator

维持一个指向Component对象的指针,并定义一个与Component接口一致的接口。

4>ConcreteDecorator

向组件添加职责。

7:协作:

Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。

8:效果:

1>优点:

1)比静态继承更灵活。

Decorator模式提供了更加灵活的向对象添加职责的方式,在运行时刻添加和删除职责。

相比于使用继承,Decorator模式可以很容易地重复添加一个特性,而重复继承很容易出错。

2)避免在层次结构高层的类有太多特征。

Decorator模式提供了一种“即用即付”的方法来添加职责。可以对一个简单的类扩展出复杂的

功能。

2>缺点:

1)Decorator和它的Component不一样。

被装饰了的组件和没装饰时是有差别的,因此,使用装饰时不应该依赖对象标识。

装饰后,在别的对象看来,就是Decorator类了,而不是ConcreteCompnent类了

2)有许多小对象。

采用Decorator模式进行系统设计往往会产生许多看上去类似的小对象,这些对象仅仅在他们相互

连接的方式上有所不同,而不是它们的类或是他们的属性值有所不同。所以这些系统很难学习和排错。

9:实现:

1>接口的一致性:

装饰对象的接口必须与它所装饰的Component的接口是一致的,因此所有的ConcreteDecorator类必须

有一个公共的父类。

2>省略抽象的Decorator类:

当你仅需要添加一个职责时,没有必要定义抽象的Decorator类。

3>保持Component类的简单性:

为了接口的一致性,组件和装饰都必须继承自Component类,所以保持这个类的简单性很重要。

也就是把这个类设计目的集中于接口设计,而不是存储数据。

4>改变对象外壳与改变对象内核:

可以把Decorator类当作是一个对象的外壳,添加Decorator类可以改变一个对象的行为,但是当

Component类很庞大时,添加一个Decorator类代价就显得很大。所以可以选择使用另外一种模式:

Strategy模式,组件可以将一些行为转发给一个独立的策略对象,通过改变策略对象,就可以达到

改变或扩充组件的功能。

10:代码示例:                                                                            */

//Component类,提供了接口

class VisualComponent

{

public:

VisualComponent();

virtual
void Draw();

virtual
void Resize();

...

};

//abstract Decorator类

class Decorator :public VisualComponent

{

public:

Decorator(VisualComponent*);

virtual
void Draw();

virtual
void Resize();

...

private:

VisualComponent* _component;

};

void Decorator::Draw()

{

_component->Draw();

}

void Decorator::Resize()

{

_component->Resize();

}

//ConcreteDecorator类
在自己的Draw()中添加了要添加的职责--绘制边框

class BorderDecorator :public Decorator

{

public:

BorderDecorator(VisualComponent*,int borderWidth);

virtual
void Draw();

private:

void DrawBorder(int);

private:

int _width;

};

void BorderDecorator::Draw()

{

Decorator::Draw();

DrawBorder(_width);

}

//这里的SetContents以一个Component指针为参数,来进行一些操作,

//通过装饰就可以传入一个装饰过的类

void Window::SetContents(VisualComponent* contents)

{

...

}

Window* window =new Window;

//未经装饰的类,TextView是继承自Component类的ConcreteComponent类

TextView* textView =new TextView;

//它可以被这样传入

window->SetContents(textView);

//也可以通过装饰来传入,这样装饰就增加了起码两个Component大小的内存了,所以

//如果Compnent如果很庞大的话,使用代价会很高。

window->SetContents());

//再考虑一个问题,如果深度很深的话,实现起来效率也会下降。

//何谓深度,就是装饰了很多很多次,这里的调用其实就是通过指针不断访问下一个对象调用Draw(),就和链表一样,

//如果深度很深,那么就像遍历链表一样。

//这时可以考虑实现中最后一点说的,使用strategy模式。

设计模式 笔记 装饰模式 Decorator的更多相关文章

  1. 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)

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

  2. 二十四种设计模式:装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...

  3. 设计模式-09装饰模式(Decorator Pattern)

    1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...

  4. 设计模式之装饰模式(Decorator)摘录

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengbingchun/article/details/29237955 23种GOF设计模式一般分 ...

  5. 结构型设计模式之装饰模式(Decorator)

    结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...

  6. 设计模式之装饰模式(Decorator)

    装饰模式原理:给对象增加特性,这种特性是一种累加的效果 代码如下 #include <iostream> #include <string> #include <list ...

  7. 【设计模式】—— 装饰模式Decorator

    前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下 ...

  8. Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用

    Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...

  9. 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. SQL Server在本地计算机上用SSMS(SQL Server Management Studio)登录不上,错误消息:(Microsoft SQL Server, Error: 18456)

    今天遇到了一个奇怪的问题,公司目前在SQL Server上都采用AD域账号登录,由于账号人数众多,所以我们建立了一个AD Group(域组),将大家的AD账号加入了这个AD Group,然后我们将这个 ...

  2. python基础学习12----装饰器

    装饰器可以在不修改目标函数代码的前提下, 在目标函数执行前后增加一些额外功能 例如有一个简单的函数 import time def func1(): print("这是一个简单的函数&quo ...

  3. Redis缓存穿透、缓存雪崩、redis并发问题分析

    把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数据量很大的时候,经典的几个问题如下: (一)缓存和数据库间数据一致性问题分布式环境下(单机就不用说了)非常 ...

  4. 用LinkedList

      >用LinkedList模拟栈集合MyStack >MyStack测试类   用LinkedList模拟栈集合MyStack import java.util.LinkedList; ...

  5. 分享-结合demo讲解JS引擎工作原理

    代码如下: var x = 1; function A(y){ var x = 2; function B(z){ console.log(x+y+z); } return B; } var C = ...

  6. linux 的常用命令---------第四阶段

    权限管理 “4” “r” → 读权限: 查看文件内容: 是否能够列出目录结构. “2” “w” → 写权限: 编辑文件内容: 是否能够创建.删除.复制.移动目录. “1” “x” → 执行权限: 对二 ...

  7. python-celery定时提交任务

    pip install celery 使用消息中间件:RabbitMQ/Redis app=Celery('任务名',backend='xxx',broker='xxx') 基本使用 import c ...

  8. oracle查询父节点及其下所有子节点

    1.我们的组织机构就是这种树形菜单的格式. . 2.执行sql: select ( select organization_name from SYS_ORGANIZATION where organ ...

  9. Html5多媒体相关的API---video

    Html5多媒体相关的API---video 在HTML5中,新增了两个元素---video元素与audio元素,其中video元素专门用来播放网络上的视频或电影,而audio元素专门用来播放网络上的 ...

  10. input全选与单选(把相应的value放入隐藏域去)

    框架是Jquery 需求是: 页面上有很多复选框,1.当我选择一项复选框时候 把对应的值放入到隐藏域去 2.当我反选的时候 把隐藏域对应的值删掉.3.当我全选的时候 页面上所有的选择框的值一起放到隐藏 ...