转载:http://blog.csdn.net/yanbober/article/details/45395747

一、装饰者模式的定义

装饰者( Decorator )模式又叫做包装模式。通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案

二、模式中包含的角色及其职责

  • 抽象组件角色: 一个抽象接口,是被装饰类和装饰类的父接口。
  • 具体组件角色:为抽象组件的实现类。
  • 抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口。
  • 具体装饰角色:为抽象装饰角色的实现类。负责具体的装饰。

三、装饰者模式的特点

(1)装饰者和被装饰者有相同的接口(或有相同的父类)。
(2)装饰者保存了一个被装饰者的引用。
(3)装饰者接受所有客户端的请求,并且这些请求最终都会返回给被装饰者。
(4)在运行时动态地为对象添加属性,不必改变对象的结构。

四、Demo

抽象组件角色

/*** @author yangshijing* @desc Component* @created 2018/3/21 0021*/
public abstract  class Person {String description = "Unkonwn";public String getDescription(){return description;}//计算花费public abstract double cost();
}

具体组件角色

/*** @author yangshijing* @desc ConcreteComponent* @created 2018/3/21 0021*/
public  class Teenager extends Person {public Teenager() {description = "Shopping List:";}@Overridepublic double cost() {return 0;}}

抽象装饰角色

/*** @author yangshijing* @desc Decorator* @created 2018/3/21 0021*/
public abstract class ClothingDecorator extends Person {@Overridepublic abstract String getDescription();
}

具体装饰角色

/*** @author yangshijing* @desc ConcreteDecorator* @created 2018/3/21 0021*/
public class Shirt extends ClothingDecorator {/*** 用实例变量保存Person的引用*/Person person;public Shirt(Person person) {this.person = person;}@Overridepublic String getDescription() {return person.getDescription() + "a shirt  ";}@Overridepublic double cost() {//实现了cost()方法,并调用了person的cost()方法,目的是获得所有累加值return 100 + person.cost();}
}

View Code

/*** @author yangshijing* @desc ConcreteDecorator* @created 2018/3/21 0021*/
public class Casquette extends ClothingDecorator {Person person;public Casquette(Person person) {this.person = person;}@Overridepublic String getDescription() {//鸭舌帽return person.getDescription() + "a casquette  ";}@Overridepublic double cost() {return 75 + person.cost();}
}

View Code

五、测试方法及结果

/*** @author yangshijing* @desc 测试方法* @created 2018/3/21 0021*/
public class Shopping {public static void main(String[] args) {Person person = new Teenager();person = new Shirt(person);person = new Casquette(person);System.out.println(person.getDescription() + " ¥ " +person.cost());}}

控制台输出

Shopping List:a shirt  a casquette   ¥ 175.0

六、UML类图

转载于:https://www.cnblogs.com/realshijing/p/8618122.html

Java设计模式(7)——装饰者模式相关推荐

  1. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  2. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  3. Java设计模式之三--装饰者模式

    转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...

  4. (设计模式七)java设计模式之装饰器模式

    一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...

  5. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  6. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  7. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

  8. java设计模式之装饰者模式

    为什么80%的码农都做不了架构师?>>>    定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...

  9. java与模式孙悟空_由孙悟空的七十二变看Java设计模式:装饰者模式

    应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减50 每满减:每满100减10 打折:买两件8折,三件7折 数量减:满三件减去最低价的一件 假设现在顾客买了两件 ...

  10. java设计模式之装饰器模式(包装器模式)

    显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...

最新文章

  1. 可视化的数据结构和算法
  2. java 封装优化工具_利用Java注解的简单封装的一次优化
  3. 算法(第4版)Robert Sedgewick 刷题 第一章(1)
  4. Java读取word文件,字体,颜色
  5. 带权中位数-算法导论第三版第九章思考题9-2
  6. JS之按照Unicode返回指定字符串
  7. 当 Egg 遇到 TypeScript,收获茶叶蛋一枚 #27
  8. 问题 I: Sequence Problem : Array Practice
  9. php 使用json 教程,PHP使用JSON 教程
  10. 新加用户被保护的解决办法
  11. 计算机视觉实战(三)阈值与平滑处理
  12. .Net Pet Shop 4 初探之一:初识PetShop4
  13. 全局变量不能放在头文件其中
  14. FAT32U盘挂载无法更改权限记录
  15. “声波识别”可用于购物
  16. 50k热敏电阻温度对照表c语言,50K热敏电阻温度表..doc
  17. linux学习书籍汇总 值得推荐的linux学习书籍
  18. AutoJs学习-图灵QQ自动聊天机器人
  19. 小程序微信支付errcode:40163问题
  20. Torch not compiled with CUDA enabled报错的解决办法

热门文章

  1. Linux 管道通信 客户端与服务器通信
  2. hdu 4302 Holedox Eating 线段树去维护蛋糕!! 多校联合赛第三题
  3. Illustrator中文版教程,如何在 Illustrator 中使用不透明度和混合模式?
  4. Pr 2021快速入门教程,如何新建项目及首选项的基础设置?
  5. iOS开发经验总结(一)
  6. Mac中将 WEBP 图片转成 JPG、PNG 格式的 2 种方法
  7. 如何在Mac上的键盘辅助功能中使用面板编辑器?
  8. 为什么说Mac比windows更安全?
  9. 攻击银行内网,黑客只要三步
  10. 《嵌入式设备驱动开发精解》——1.1 本书内容的组织