Java设计模式(7)——装饰者模式
转载: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)——装饰者模式相关推荐
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- Java 设计模式之装饰者模式
一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...
- Java设计模式之三--装饰者模式
转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...
- (设计模式七)java设计模式之装饰器模式
一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- java设计模式之装饰器模式
一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...
- Java 设计模式之装饰器模式
装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...
- java设计模式之装饰者模式
为什么80%的码农都做不了架构师?>>> 定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 特点: ...
- java与模式孙悟空_由孙悟空的七十二变看Java设计模式:装饰者模式
应用场景 京东.天猫双十一,情人节商品大促销,各种商品有不同的促销活动 满减:满200减50 每满减:每满100减10 打折:买两件8折,三件7折 数量减:满三件减去最低价的一件 假设现在顾客买了两件 ...
- java设计模式之装饰器模式(包装器模式)
显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...
最新文章
- IDEA使用log4j
- Charlse 抓包
- jqGrid列的统计
- 51 MM配置-库存管理和实际库存-设置“交货完成”标识
- 媒体查询 200304
- Vue——进阶(过滤器、数据交互、生命周期、ES6语法)
- php开发uki引流脚本,UKI引流脚本
- 四、物理优化(4)分区视图
- C++ 变量初始化规则
- android 从媒体库去数据
- linux下的inode相关知识
- python将多个列表合并_Python中将两个或多个list合成一个list的方法小结
- Vast.ai GPU服务器连接
- UEFI开发探索98 – 硬盘访问Diskdump
- scala的 case class与class的区别
- JAVA课程设计——小学数学练习
- 使用MindStudio进行城市道路交通预测
- 【通俗易懂学JAVA】——public void与public static void的区别
- 刷脸支付无人便利店的使用体验也更好了
- October——Just believe youself,you really did good job