【结构型】Decorate模式
装饰模式主要意图是为对象扩展额外的职责,但对于用户来说,在使用行为上并没有任何的变化。在此举一个例子来解释该模式的含义。假如你手上有一张照片,此时可以给它盖上一片玻璃片,同时再套上一个精美的相框。如此相片就更好看同时又被更好地防护起来。此处的玻璃片以及相框,对于原来的照片来说,都是起到一个装饰的作用。并且,加上这些装饰后的照片,你能说它不是照片吗?不,它还是一个照片,是一个被精美装饰过后的照片。
在编程设计上,上面例子可描述如下:
class IImage
{
public:
// 图像总是要被绘制出来的
virtual void draw() {}
};
class Photograph : public IImage
{
public:
// some code here........
};
class PhotograhDecorate : public IImage
{
public:
// some code here........ protected:
inline IImage* getImage() { /* some code here........*/ } private:
IImage* _image;
};
class GlassDecorate : public PhotograhDecorate
{
public:
virtual void draw() override {
getImage()->draw();
this->drawGlass();
} private:
void drawGlass() {
// some code here........
} }; class FrameDecorate : public PhotograhDecorate
{
public:
virtual void draw() override {
getImage()->draw();
this->drawFrame();
} private:
void drawFrame() {
// some code here........
} };
相片装饰编码参考
由上面的定义以及例子,可以看出装饰其实是可以无限嵌套下去的。给相片装饰完了玻璃,接着又将装饰完玻璃后的相片一起用相框给装饰上。装饰模式的类关系结构图参考如下:

装饰模式的优缺点分析:
1) 如果前面的相片例子中,不使用装饰模式的话,则用户期望想要一张盖上玻璃片的相片的话,则需要从Photograph类继承下来实现一个玻璃片相片类。如果再想要一个带相框效果的照片,则又需要继承一个分支出来。如果想要一张盖上玻璃片又带相框的照片,则又需要第三个分支。试想下,如果此时还有第三种装饰情况了?比如:在照片的右下角有明星签名显示。那子类的数量就多了N种了。子类的数量是相于当所有装饰效果的组合。如此下去,随着装饰效果种类的增加,Photograph的类系将十分复杂,增量方式是以所有装饰效果的组合数量增长了。
此时如果使用装饰模式,则只需要N个的装饰类即可。需要什么效果,就新增一个装饰类即可。因此,扩展效果十分方便,效果的新增也不会引起Photograph类系的动荡。所写的任何装饰效果都是可以随意组合使用,而且对用户来说,使用上与直接使用照片Photograph类,没有任何区别。
2) 由于增加了装饰类系,因此,系统中就多了许多附加的类。如果一个相片拥有100种附加效果,则就需要增加100个装饰类。这其实也会给系统维护增加难度。
3) 某一类系的装饰类,只是针对某一对象装饰。如果系统中有非常多的对象都有它们自己的装饰类,上面第2)的问题就更加严重。
4) 在使用装饰框时,如果待装饰的对象较为复杂时,比如:前面例子中的相片类很复杂时,则它的装饰类系的实现难度会很大。因此,实现代价也会随之增加。从此点看,在动手设计装饰类前,需要先考虑清楚。
【结构型】Decorate模式的更多相关文章
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- 结构型--代理模式(Proxy)
一.代理模式是什么? 代理模式属于GOF23设计模式中结构型中的设计模式,通过代理对象来屏蔽(部分或者屏蔽)对真实对象的直接访问,下图为UML图: 在代理模式中组件包括:抽象角色接口.代理角色类.真实 ...
- 结构型---组合模式(Composite Pattern)
组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...
- 结构型---外观模式(Facade Pattern)
定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通 ...
- 结构型---桥接模式(Bridge Pattern)
定义 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化.桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现 ...
- 结构型---代理模式(Proxy Pattern)
代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的地址空间可以是本电脑中,也可以在另一台电脑中.最典型 ...
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- C#设计模式之十三代理模式(Proxy)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- 结构型模式(七) 代理模式(Proxy)
一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...
随机推荐
- 自己的缺省(sheng)源
write无力吐槽了 #include <cstdio> #include <iostream> #include <algorithm> #include < ...
- POJ 3268 Silver Cow Party ( Dijkstra )
题目大意: 有N个农场每个农场要有一头牛去参加一个聚会,连接每个农场有m条路, 聚会地点是X,并且路是单向的.要求的是所有牛赶到聚会地点并且回到自己原先的农场所需要的最短时间. 题目分析: 其实就是以 ...
- 【二分】【高精度】Vijos P1472 教主的集合序列
题目链接: https://vijos.org/p/1472 题目大意: S1={1,2,3…n}.当i>1时,Si为集合Si-1中任意两个不相同数之和的集合. 将每个集合中所有元素取出,集合S ...
- 源代码管理工具TFS2013安装与使用
最近公司新开发一个项目要用微软的TFS2013进行项目的源代码管理,以前只是用过SVN,从来没有用过TFS,所以在网上百度.谷歌了好一阵子来查看怎么安装和配置,还好花了一天时间总算是初步的搞定了,下面 ...
- 您好,想问一下目前哪些营业厅可以办理NFC-SIM卡的更换业务?_百度知道
您好,想问一下目前哪些营业厅可以办理NFC-SIM卡的更换业务?_百度知道 您好,想问一下目前哪些营业厅可以办理NFC-SIM卡的更换业务? 2013-06-14 10:39 maxre ...
- ANT打包 小实例
ANT打包 package src; public class Hello { /** * @param args */ public static void main(String[] a ...
- 使用FTPClient进行文件服务器内文件的上传和下载
我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ...
- java—— 文件操作
目录: 1.博文链接 2. 1.博文链接 向文件未追加内容:流操作通过BufferedWriter向文件末尾追加内容的几种常用方法
- 1st day
学习配置环境,听的一脸懵逼,不过还好装好了,哈哈哈... <?php /*写一个函数,该函数可以将给定的任意个数的参数以指定的字符串串接起来成为一个长的字符串.该函数带2个或2个以上参数,其中第 ...
- PHP学习之[第02讲]PHP5.4 Apache Mysql 搭配与多站点配置详解
小编用的是MAC系统,SO安装的是MAMP 知识点: 1.配置多站点:httpd.conf打开httpd-vhosts.conf,并在httpd-vhosts.conf设置多IP及端口指向,最后修改/ ...