Motivation

你可以通过继承,静态的扩展对象的功能(编译期);然而有时候你需要在对象被使用的时候,动态的扩展对象的功能(运行期);这个时候你就需要装饰者模式。

Intent

装饰者模式的目的是 动态地为 一个对象 增加额外的职责;

Implement

UML 图


解释:

Component: 被装饰对象的父类接口
ConcreteComponent:被装饰的具体实现类
Decorator:装饰者接口,包含了一个对 Component 的引用
ConcreteDecorators:具体的装饰者实现类

Examples

咖啡 和 调料 的装饰关系
Beverage.java

package com.ycit.head.first.decorator;/*** 星巴兹咖啡抽象类,添加不同的调料价格不同* Created by xlch on 2017/5/10.*/
public abstract class Beverage {public String description = "unknown Beverage";public String getDescription() {return description;}public abstract double cost();}

Espresso.java

package com.ycit.head.first.decorator.impl;import com.ycit.head.first.decorator.Beverage;/*** 咖啡实现类:浓缩咖啡* Created by xlch on 2017/5/10.*/
public class Espresso extends Beverage {public Espresso() {description = "Espresso";}@Overridepublic double cost() {return 1.99;}
}

CondimentDecorator.java

package com.ycit.head.first.decorator;/*** 调料装饰器,继承 Beverage* Created by xlch on 2017/5/10.*/
public abstract class CondimentDecorator extends Beverage {public abstract String getDescription();}

Mocha.java

package com.ycit.head.first.decorator.impl;import com.ycit.head.first.decorator.Beverage;
import com.ycit.head.first.decorator.CondimentDecorator;/*** mocha 调料* Created by xlch on 2017/5/10.*/
public class Mocha extends CondimentDecorator {Beverage beverage;public Mocha(Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + ",Mocha";}@Overridepublic double cost() {return beverage.cost() + .20;}
}

Soy.java

package com.ycit.head.first.decorator.impl;import com.ycit.head.first.decorator.Beverage;
import com.ycit.head.first.decorator.CondimentDecorator;/*** soy 调料* Created by xlch on 2017/5/10.*/
public class Soy extends CondimentDecorator {Beverage beverage;public Soy (Beverage beverage) {this.beverage = beverage;}@Overridepublic String getDescription() {return beverage.getDescription() + ", Soy";}@Overridepublic double cost() {return beverage.cost() + .20;}
}

还可以有很多其他调料;

测试类:

package com.ycit.head.first.decorator.impl;/*** Created by xlch on 2017/5/10.*/
public class Main {public static void main(String [] args) {/**我需要一杯mocha 浓缩咖啡**/Espresso espresso = new Espresso();Mocha mocha = new Mocha(espresso);System.out.println(mocha.getDescription());System.out.println(mocha.cost());/**我需要一杯mocha + soy 浓缩咖啡**/Soy soy = new Soy(mocha);System.out.println(soy.getDescription());System.out.println(soy.cost());}}

Case

Jdk 中的 输入输出流的设计利用了 装饰器模式;
其中的 FilterInputStream 相当于该处的 Decorator
具体的实现类包括:

  • BufferedInputStream
  • DataInputStream
  • PushbackInputStream

【design pattern】结构型模式之—装饰者模式(Decorator)相关推荐

  1. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  2. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  3. java模式之装饰器模式

    定义: 装饰器模式也叫作包装器模式,只在不改变原有对象的基础上,动态的给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比生成子类更为灵活,属于结构型设计模式 装饰器模式提供了比继承更有弹性的 ...

  4. 设计模式之门面模式与装饰器模式详解和应用

    目录 1 门面模式定义 1.1 门面模式的应用场景 1.2 门面模式的通用写法 1.3 门面模式业务场景实例 1.4 门面模式在源码中的应用 1.5 门面模式的优缺点 2 装饰器模式 2.1 装饰器模 ...

  5. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  6. 策略模式、工厂模式、装饰者模式总结解析

    今天在面试的时候被问到自己策略模式怎么用的时候有被问懵到,以至于明明是自己的代码在脑海里已经混乱了,而且面试官提出的还是没有更好的利用设计模式也让我思考了一下我之前的代码到底是怎么实现的,重新梳理下策 ...

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

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

  8. 代理模式和装饰者模式

    简介 代理模式和装饰者模式是两种常见的设计模式.代理模式是为其它对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到 ...

  9. 桥接模式和装饰者模式的区别

    桥接模式和装饰者模式的区别 桥接模式的角色 实现化角色 具体实现化角色 抽象化角色 具体抽象化角色 装饰者模式角色 抽象构件角色 具体抽象构件角色 抽象装饰角色 具体抽象装饰角色 桥接模式的类图 装饰 ...

  10. 代理模式与装饰器模式有何区别?

    本文有一些争议,谈论的是设计模式中的代理模式和装饰器模式的区别,但笔者是非常赞同文章的观点的,有种豁然开朗的感觉. 以下是原文 代理模式与装饰器模式有何区别? 我想有必要对此问题谈一下我的个人理解,若 ...

最新文章

  1. 383. Ransom Note/691. Stickers to Spell Word-- String, Map, back tracking-- 未完待续
  2. 优秀的服务器托管服务商的必备要素
  3. python3精要(49)-生成器
  4. Solr单集代码调用案例
  5. 怎样配oracle环境,oracle配置会话环境(set命令)
  6. SVG 入门——理解viewport,viewbox,preserveAspectRatio
  7. python的枚举和for循环_python入门与进阶篇(三)之分支、循环、条件与枚举,python枚举...
  8. 升级到新SQL Server版本
  9. sql server表分区_SQL Server 2016增强功能– SQL截断表和表分区
  10. NSString 转为gbk
  11. 公基会考计算机知识,公基计算机基础知识汇总70.doc
  12. TCPIP三次握手详情
  13. JQuery小插件,Selected插件1
  14. html站点地图怎么做,网站地图(站点地图)详细介绍、以及如何制作详解
  15. RN react-native-wechar 微信支付、分享
  16. html 消除序号,JS实现删除一行数据页面序号重新排序功能。
  17. Windows安装MySql
  18. Java计算两个时间段的天数_java计算两个时间段的精确天数
  19. Unity插件篇:Pocket RPG Weapon Trails(武器拖尾特效)部分解读以及基本用法
  20. 计算机怎么打开隐藏的项目,展示win10系统怎么打开隐藏文件夹

热门文章

  1. 你是如何对待植物神经紊乱的?
  2. zed相机拆机_「zed」zed双目相机的windows配置 - 金橙教程网
  3. 【我的OpenGL学习进阶之旅】 OpenGL ES 实现 绿幕抠图 以及 替换绿幕背景的功能
  4. #小车记1--树莓派系统安装及初始化教程
  5. HttpHandler【转】
  6. 软件测试工程师的技能树
  7. 获取特定 Channel 的区块链信息
  8. 邮件群发 php shell,使用shell来群发邮件
  9. [ArcGIS] 空间分析(十一)ArcGIS眼中的3D世界 -3D折线
  10. 初中计算机教师资格证内容,教师资格证考试大纲——《信息技术学科知识与教学能力》(初级中学)...