转载: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. IDEA使用log4j
  2. Charlse 抓包
  3. jqGrid列的统计
  4. 51 MM配置-库存管理和实际库存-设置“交货完成”标识
  5. 媒体查询 200304
  6. Vue——进阶(过滤器、数据交互、生命周期、ES6语法)
  7. php开发uki引流脚本,UKI引流脚本
  8. 四、物理优化(4)分区视图
  9. C++ 变量初始化规则
  10. android 从媒体库去数据
  11. linux下的inode相关知识
  12. python将多个列表合并_Python中将两个或多个list合成一个list的方法小结
  13. Vast.ai GPU服务器连接
  14. UEFI开发探索98 – 硬盘访问Diskdump
  15. scala的 case class与class的区别
  16. JAVA课程设计——小学数学练习
  17. 使用MindStudio进行城市道路交通预测
  18. 【通俗易懂学JAVA】——public void与public static void的区别
  19. 刷脸支付无人便利店的使用体验也更好了
  20. October——Just believe youself,you really did good job

热门文章

  1. KeyBlaze for mac(专业打字练习软件)激活版
  2. 只需一个设置命令隐藏 MacBook Pro 浏海
  3. C++ 4 C++变量及作用域
  4. 物流广告收入实现高速增长 国际投行看好京东转型潜力
  5. 62. KVOController详解
  6. [控件] 将字符串转换成贝塞尔曲线并执行动画
  7. WPF笔记(1.8 资源与映射)——Hello,WPF!
  8. UIAlertView 弹框
  9. HTTP协议和HttpClient的入门
  10. win7下MongoDB集群告别裸奔