设计模式 笔记 装饰模式 Decorator
//---------------------------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的更多相关文章
- 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern)
原文:乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 装饰模式(Decorator Pattern) 作者:weba ...
- 二十四种设计模式:装饰模式(Decorator Pattern)
装饰模式(Decorator Pattern) 介绍动态地给一个对象添加一些额外的职责.就扩展功能而言,它比生成子类方式更为灵活.示例有一个Message实体类,某个对象对它的操作有Insert()和 ...
- 设计模式-09装饰模式(Decorator Pattern)
1.模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制:使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是 ...
- 设计模式之装饰模式(Decorator)摘录
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/fengbingchun/article/details/29237955 23种GOF设计模式一般分 ...
- 结构型设计模式之装饰模式(Decorator)
结构 意图 动态地给一个对象添加一些额外的职责.就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活. 适用性 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. ...
- 设计模式之装饰模式(Decorator)
装饰模式原理:给对象增加特性,这种特性是一种累加的效果 代码如下 #include <iostream> #include <string> #include <list ...
- 【设计模式】—— 装饰模式Decorator
前言:[模式总览]——————————by xingoo 模式意图 在不改变原来类的情况下,进行扩展. 动态的给对象增加一个业务功能,就功能来说,比生成子类更方便. 应用场景 1 在不生成子类的情况下 ...
- Netty学习-IO体系架构系统回顾 & 装饰模式Decorator的具体使用
Netty学习-IO体系架构系统回顾 IO和NIO的学习 NIO - 1.4 开始出的 在网络应用框架中,NIO得到了大量的使用,特别是netty里面 前提:对IO及其了解 对IO的总结和回顾 理解J ...
- 设计模式系列之装饰模式(Decorator Pattern)——扩展系统功能
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- sql Server插不进数据,以及Id自增的教程及注意事项
参考于:https://jingyan.baidu.com/article/fec4bce244f902f2608d8b7a.html 使用SQL Server 2014 数据库做web的项目出现错误 ...
- Python实例---爬去酷狗音乐
项目一:获取酷狗TOP 100 http://www.kugou.com/yy/rank/home/1-8888.html 排名 文件&&歌手 时长 效果: 附源码: import t ...
- Linux运维之--zabbix使用(实时更新)
之前安装的是zabbix3.x版本,今天尝试安装zabbix4.2版本,并做个总结.建议生产环境还是使用3.4版本比较好,因为4.2版本上可能语法又增加了一些,所以建议使用熟练的版本 1.首先是安装z ...
- [BZOJ 3652]大新闻
[BZOJ 3652] 大新闻 题意 随机从 \([0,n)\) 中选取一个整数 \(x\), 并从 \([0,n)\) 中再选取一个整数 \(y\). 有 \(p\) 的概率选取一个能令 \(x\o ...
- JSONP方法解决跨域请求
Ajax跨域请求的问题 跨域:跨域名, 一个域名下的文件去请求了和他不一样的域名下的资源文件(注意是请求文件,而不是数据接口),那么就会产生跨域请求,下面来写一个ajax来跨域请求的例子 <!D ...
- 死磕nginx系列--使用upsync模块实现负载均衡
问题描述 nginx reload是有一定损耗的,如果你使用的是长连接的话,那么当reload nginx时长连接所有的worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程 ...
- Android MaterialDesign之水波点击效果的几种实现方法
什么是水波点击的效果? 下面是几种不同的实现方法的效果图以及实现方法 Video_2016-08-31_003846 如何实现? 方法一 使用官方提供的RippleDrawable类 优点:使用方 ...
- day4-课堂代码
# ---------------------------------------------------------------------- # def my_function1(name, ad ...
- linux网络工具iproute2的使用简介
一.写本文的目的 本文完全是自己在学习iproute2的过程中搜集的大杂烩,记录在这里,方便以后自己查询学习,图片都是来自网络,在此表示感谢! 二.简单了解iproute2工具套装 iproute2是 ...
- asdm不能登录问题;浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整
asdm不能登录问题:浏览器必须是ie,不能是chrome或者firefox;java的版本,尤其是安全等级和例外需要调整