JAVA设计模式---装饰者模式
写在前面的话:
该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。
该模式的实现意味着一群装饰者类,这些类反映出被装饰的组件类型,用来包装具体组件。
缺点在于,可以用无数个装饰者包装一个组件,但会导致设计中出现许多小对象,如果过度引用,会让程序变得很复杂。
案例分析:
需求:模拟 StarbuzzCoffee 的订单系统,咖啡原种类为Espresso,HouseBlend,添加调料种类分别为Soy,Mocha,Whip,对应不同的收费,杯子分为大中小三种,分别对应不同的收费
代码实现:
1)咖啡部分:
public abstract class Beverage {
String description = "Unknown Beverage";
public String getDescription(){
return description;
}
public abstract double cost();
}
public class Espresso extends Beverage {
public Espresso() {
description = "Espresso";
}
@Override
public double cost() {
return 1.99;
}
}
public class HouseBlend extends Beverage {
public HouseBlend() {
description = "HouseBlend";
}
@Override
public double cost() {
return 0.89;
}
}
2)调料部分:
public abstract class CondimentBeverage extends Beverage {
public abstract String getDescription();
}
public class Soy extends CondimentBeverage {
Beverage beverage;
public Soy(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.30+beverage.cost();
}
}
public class Mocha extends CondimentBeverage {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.20+beverage.cost();
}
}
public class Whip extends CondimentBeverage {
Beverage beverage;
public Whip(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.40+beverage.cost();
}
}
3) 杯子选择:
public abstract class Size extends Beverage {
public abstract String getDescription();
}
public class BigSize extends Size {
Beverage beverage;
public BigSize(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.30+beverage.cost();
}
}
public class MiddleSize extends Size {
Beverage beverage;
public MiddleSize(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.20+beverage.cost();
}
}
public class SmalleSize extends Size {
Beverage beverage;
public SmalleSize(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription();
}
@Override
public double cost() {
return 0.10+beverage.cost();
}
}
4)测试代码---生产订单:
public class StarbuzzCoffee {
public static void main(String[] args) {
Beverage beverage1 = new Espresso(); //订一杯Espresso,不添加任何调料
System.out.println(beverage1.getDescription()+":$"+beverage1.cost());
Beverage beverage2 = new HouseBlend(); //订一杯HouseBlend,不添加任何调料
beverage2 = new Mocha(beverage2);
beverage2 = new Mocha(beverage2); //两份摩卡
System.out.println(beverage2.getDescription()+"(double Mocha):$"+beverage2.cost());
beverage2 = new Soy(beverage2); //再加一份soy
System.out.println(beverage2.getDescription()+"(additional Soy):$"+beverage2.cost());
beverage2 = new Whip(beverage2); //再加一份whip
System.out.println(beverage2.getDescription()+"(additional Whip):$"+beverage2.cost());
beverage2 = new MiddleSize(beverage2); //选择中杯
System.out.println(beverage2.getDescription()+"(choose middleSize):$"+beverage2.cost());
}
}
测试结果:
Espresso:$1.99
HouseBlend(double Mocha):$1.29
HouseBlend(additional Soy):$1.59
HouseBlend(additional Whip):$1.99
HouseBlend(choose middleSize):$2.19
JAVA设计模式---装饰者模式的更多相关文章
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
- JAVA设计模式--装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- 【设计模式】Java设计模式 - 装饰者模式
Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...
- JAVA 设计模式 装饰者模式
用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构
- Java 设计模式—装饰者模式
在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式. 演示样例代码: * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类 * @autho ...
- Java设计模式の装饰者模式
目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...
- Java设计模式--装饰器模式到Java IO 流
装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...
- 设计模式-装饰者模式(Decorator Pattern)
本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...
随机推荐
- 【转】adb操作命令详解及大全
adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.a ...
- dotnet core webapi +vue 搭建前后端完全分离web架构
架构 服务端采用 dotnet core webapi 前端采用: Vue + router +elementUI+axios 问题 使用前后端完全分离的架构,首先遇到的问题肯定是跨域访问.前后端可 ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- HDU 1003 Max Sum【动态规划求最大子序列和详解 】
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- BZOJ3930: [CQOI2015]选数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3930 容斥原理. 令l=(L-1)/k,r=R/k,这样找k的倍数就相当于找1的倍数. 设F[ ...
- DFS(dfs)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2212 DFS Time Limit: 5000/2000 MS (Java/Others) Me ...
- android新闻App源码、仿微信源码、地图音乐源码等
Android精选源码 一款实用的休闲类App,新闻视频和技术应有尽有. android实现交互式K线图表源码 android新闻客户端和服务器源码 android MatetialDesign设计 ...
- 开始使用 HBuilder 和 Mui - 1 - 分析 index.html ;
转自:http://ask.dcloud.net.cn/article/240 好吧,在比较了 Codenameone 和 HBuilder 以后,俺反复考虑后,终于还是决定使用 HBuilder 这 ...
- Spark算子--SortBy
转载请标明出处http://www.cnblogs.com/haozhengfei/p/39edcbb10b5076599c0e5609b7136b88.html SortBy--Transforma ...
- GO开发[五]:golang结构体struct
Go结构体struct Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性 ...