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) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...
随机推荐
- 细说log4j
可能做过java项目的基本上都是用过log4j,它是用来做java日志的.比如我们做一个项目分为很多的模块,那我们怎么想要知道它什么时候启动了,这时候我们可以使用log4j标记某某模块启动了. 努力的 ...
- LibreOJ NOI Round #1 Day 1 B. 失控的未来交通工具
瞬间移动 官方题解 题意:一个带边权无向图,加边以及询问在 x,x+b,...,x+(c−1)bx,x+b,...,x+(c-1)bx,x+b,...,x+(c−1)b 这些数中,有多少存在一条与之模 ...
- 2017ecjtu-summer training # 11 POJ 2492
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 38280 Accepted: 12452 D ...
- 最新版Sublime Text Build 3156 x64 的下载 + 注册码 + Install Package Control + 汉化教程
一.Sublime Text 下载 神器 Sublime Text 最近开始更新到开发版本 Build 3156,本身英语不是太6,汉化党自然各种百度汉化教程,网上不是一堆绿色汉化包,就是让你下载汉 ...
- c++(选择排序)
选择排序是和冒泡排序差不多的一种排序.和冒泡排序交换相连数据不一样的是,选择排序只有在确定了最小的数据之后,才会发生交换.怎么交换呢?我们可以以下面一组数据作为测试: 2, 1, 5, 4, 9 第一 ...
- 将项目(代码)从GitHub上克隆(下载)到本地仓库
要将项目从GitHub上克隆到本地,首先你得下载并安装好git for window. 下载地址:http://www.xp510.com/xiazai/Application/other/30988 ...
- FTP下载导致Zip解压失败的原因
情形:网关通过FTP下载快钱对账文件时通过Apache下commons-net的commons-net-3.5.jar进行封装,对账文件中有中文和英文的文字,大部分情况下能够下载成功,而且也能解压成功 ...
- 遇到安装app不识别的情况
一般->blokfile->证书设定设置
- Bundle使用&NSBundle
之 前在初始化一个类的时候:TestViewController *viewcontroller=[[TestViewController alloc]initWithNibName:@"T ...
- HTML <td> 标签的 rowspan 属性
rowspan 属性规定单元格可横跨的行数. colspan 属性规定单元格可横跨的列数.