装饰模式又叫包装模式,装饰模式以客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。装饰模式可以在不使用创造更多的子类的情况下,将对象的功能加以扩展。

装饰模式结构图如下:

其包含的角色就分为:

抽象构建角色Component:给出一个抽象结构,以规范准备接受附加责任的对象。

具体构建角色Concrete Component:定义一个将要接受附加责任的类。

装饰角色Decorator:持有一个构建Component对象的实例,并定义一个与抽象构建一直的接口

具体装饰角色Concrete Decorator:负责给构建对象增加附加责任。

装饰模式应当在什么情况下使用

在以下的情况下应当使用装饰模式:

1、 需要扩展一个类的功能,或给一个类增加附加责任。

2、 需要动态的给一个对象增加功能,这些功能可以再动态地撤销。

3、 需要增加由一些基本功能排列组合而产生的非常大量的功能,从而使继承关系变得不现实。

使用装饰模式的优点和缺点

使用装饰模式有以下的优点:

1、 装饰模式与继承关系的目的都是扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。

2、 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

3、 这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加容易出错。

使用装饰模式有以下的缺点:

由于使用装饰模式,可以比使用继承关系需要较少数目的类。使用较少的类,当然使设计比较易于进行,但是,在另一方便,使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难,特别是这些对象看上去都很相像。

九、结构模式之装饰(Decorator)模式的更多相关文章

  1. Java与模式:装饰(Decorator)模式

    装饰模式使用被装饰类的一个子类的实例.把client的调用委派到被装饰类,装饰模式的关键在于这样的扩展是全然透明的.   装饰模式在Java种使用也非常广泛,比方我们在又一次定义button.对话框等 ...

  2. 装饰(Decorator)模式

    1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.Concre ...

  3. Java进阶篇设计模式之五-----外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  4. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  5. 七个结构模式之装饰者模式(Decorator Pattern)

    定义: 使用组合的方法,动态给一个类增加一些额外的功能,避免因为使用子类继承而导致类继承结构复杂.并且可以保持和被装饰者同一个抽象接口,从而使客户端透明. 结构图: Component:抽象构件类,定 ...

  6. Java 实现装饰(Decorator)模式

    在Java在.io反映非常多类包下是典型的装饰格局,例如: new BufferedOutputStream(OutputStream out) new BufferedInputStream(Inp ...

  7. Decorator模式(装饰器模式)

    Decorator模式? 假如现在有一块蛋糕,如果只涂上奶油,其他什么都不加,就是奶油蛋糕.如果加上草莓,就是草莓奶油蛋糕.如果再加上一块黑色巧克力板,上面用白色巧克力写上姓名,然后插上代表年龄的蜡烛 ...

  8. 《Head First 设计模式》ch.3 装饰(Decorator)模式

    设计原则 类应该对修改关闭,对扩展开放(开放-关闭原则).在每个地方使用开放-关闭原则是一种浪费,也没有必要,因为这通常会引入新的抽象层次,增加代码复杂度.需要把注意力集中在设计中最有可能改变的地方. ...

  9. 涉及模式之 装饰器模式详解(与IO不解的情缘)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. LZ到目前已经写了九个设计模 ...

随机推荐

  1. BigDecimal 算数

    BigDecimal big=new BigDecimal("22.233"); BigDecimal big1=new BigDecimal("12.233" ...

  2. $NOI2014$ 购票(斜率优化 点分治)

    \(NOI2014\)购票 哇终于可以碰电脑了赶快切些火题找找感觉. 拿到这道题的时候发现简单的斜率优化推一推可以秒掉平方做法,然后一条链也可以做. 然后呢... 卧槽这个在一棵树上怎么办啊. 大力\ ...

  3. fat文件系统

    在主引导区后面就是FAT表.从上面可以得知一个FAT表是229个扇区.它里边的内容很简单,里边的内容就是指出下一个簇在哪里.你的盘有多少个簇,那么它的FAT表就要有多少个项来描述它们.因为FAT16是 ...

  4. SSH框架整合-myeclipse

    项目结构   1.mysql数据库 stuinfo /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.5.40 : Database - stuinfo ****** ...

  5. ldd3 编写scull尝试

    快速参考: #include <linux/types.h> dev_t dev_t is the type used to represent device numbers within ...

  6. Divideing Jewels

    Divideing Jewels 时间限制: 1 Sec  内存限制: 128 MB提交: 63  解决: 17[提交][状态] 题目描述 Mary and Rose own a collection ...

  7. 第二章(1.3)Python基础知识(输入输出)

    一.?输出 用print加上字符串,就可以向屏幕上输出指定的文字 print?'hello, world' print也可以打印整数. >>> print?300 二.?输入 Pyt ...

  8. idea中git回退远程仓库版本

    工作中遇到,代码已提交并已提交到远程仓库,现需要回退到之前版本,记录如下: 记录当前版本的版本号和需要回退到版本的版本号. current version:85e7f32dfe421c5892a4e2 ...

  9. docker 应用

    在ubuntu安装docker 编写Dockerfile (用来操作容器) FROM java:8 #获取java官方镜像 jdk版本为1.8 VOLUME /tmp # 数据存储目录,容器退出后数据 ...

  10. redis 服务器端安装(三)

    redis 服务器端安装(三) Redis is an open source, BSD licensed, advanced key-value store. It is often referre ...