head first 设计模式笔记3-装饰者模式:星巴兹饮料
开放原则:类应该对扩展开放,对修改关闭。
- 上篇博客中的观察者模式中,通过加入新的观察者,我们可以在任何时候扩展主题(Subject),而且不需向主题中添加代码。
- 装饰者模式也完全遵循开放原则。
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
记住:是你,还有你,一切拜托你。
是你:包装类继承(或实现)被包装类
还有你:包装类包含被包装类的一个实例
一切拜托你:非增强方法全部拜托 被包装类的实例来完成
增强方法:根据需求重写方法

代码
/**
* 饮料
* @author oy
* @date 2019年8月28日 下午11:07:33
* @version 1.0.0
*/ public abstract class Beverage {
public String description; public String getDescription() {
return description;
} public abstract double cost(); // 其他方法
public abstract String method1();
}
CondimentDecorator
/**
* 装饰类 = 饮料 + 调料
* @author oy
* @date 2019年8月28日 下午11:13:55
* @version 1.0.0
*/
public abstract class CondimentDecorator extends Beverage {
public abstract String getDescription(); // 空实现
public String method1() {
return "";
}
}
Espresso
/**
* 浓缩咖啡
*/
public class Espresso extends Beverage { public Espresso() {
description = "Espresso";
} @Override
public double cost() {
return 1.0;
} @Override
public String method1() {
return "Espresso method1()";
}
}
HouseBlend
/**
* House Blend Coffee*/
public class HouseBlend extends Beverage { public HouseBlend() {
description = "House Blend Coffee";
} @Override
public double cost() {
return 2.0; } @Override
public String method1() {
// TODO Auto-generated method stub
return "HouseBlend method1()";
}
}
Mocha
/**
* 具体的装饰类:是你,还有你,一切拜托你。*/ public class Mocha extends CondimentDecorator {//是你:Mocha是Beverage类型 Beverage beverage; // 还有你:Mocha包含Beverage的对象实例 public Mocha(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription() + ", Mocha";
} // 一切拜托你:Beverage的不需要增强的方法全部拜托给beverage对象来处理
@Override
public String method1() {
return beverage.method1();
} // 重写增强方法
@Override
public double cost() {
return 0.20 + beverage.cost();
}
}
Whip
/**
* 具体的装饰类:是你,还有你,一切拜托你。
* @author oy
* @date 2019年9月1日 上午10:06:53
* @version 1.0.0
*/
public class Whip extends CondimentDecorator {//是你 Beverage beverage; // 还有你 public Whip(Beverage beverage) {
this.beverage = beverage;
} @Override
public String getDescription() {
return beverage.getDescription() + ", Whip";
} @Override
public String method1() {
return beverage.method1();
} // 增强方法
@Override
public double cost() {
return 0.30 + beverage.cost();
}
}
测试代码
public static void main(String[] args) {
Beverage beverage = new Espresso();
System.out.println(beverage.getDescription() + " $" + beverage.cost());
System.out.println(beverage.method1());
// 用摩卡装饰Espresso(浓缩饮料)
Beverage mocha = new Mocha(beverage);
System.out.println(mocha.getDescription() + " $" + mocha.cost());
System.out.println(mocha.method1());
// 还可以继续装饰mocha
mocha = new Whip(mocha);
System.out.println(mocha.getDescription() + " $" + mocha.cost());
System.out.println(mocha.method1());
}
打印结果:
Espresso $1.0
Espresso method1()
Espresso, Mocha $1.2
Espresso method1()
Espresso, Mocha, Whip $1.5
Espresso method1()
head first 设计模式笔记3-装饰者模式:星巴兹饮料的更多相关文章
- JAVA设计模式之【装饰者模式】
JAVA设计模式之[装饰者模式] 装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮.更温馨.更实用. 在软件设计中,对已有对象(新房)的功能进行扩展(装修). 把通用功能封装在装 ...
- 【读书笔记】读《JavaScript设计模式》之装饰者模式
一.定义 装饰者模式可用来透明地把对象包装在具有同样接口的另一个对象之中.这样一来,你可以给一个方法添加一些行为,然后将方法调用传递给原始对象.相对于创建子类来说,使用装饰者对象是一种更灵活的选择(装 ...
- 《Head First 设计模式》学习笔记——观察者模式 + 装饰者模式
装饰者模式是JDK中还有一个使用较多的设计模式,上一个是观察者模式(在Swing中大量使用),业内好的API设计无一离不开常见的设计模式,通常我们所说要阅读源代码,也是为了学习大牛们的设计思路.--- ...
- HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)
装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 设计模式学习心得<装饰器模式 Decorator>
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类,用来包装 ...
- 设计模式のDecoratorPattern(装饰器模式)----结构模式
一.产生背景 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- 设计模式C++实现——装饰者模式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/walkerkalr/article/details/28633123 模式定义: 装 ...
- 重学 Java 设计模式:实战装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 对于代码你有编程感觉吗 很多人写代码往往是没有编程感觉的,也就是除了可以把功能按照固 ...
- 《Head First 设计模式》之装饰者模式
作者:Grey 原文地址:http://www.cnblogs.com/greyzeng/p/5922248.html 模式名称 装饰者模式(Decorator Pattern) 需求 定义咖啡厅中的 ...
随机推荐
- FTL2
ABSTACT 1.NAND flash memory (主要缺点): (1)partial page updates (2)general-purpose cache usually does n ...
- Luogu P3520 [POI2011]SMI-Garbage
题目 把要变边权的边拿出来找欧拉回路就行了.正确性显然,因为一条边经过两次相当于对欧拉回路度数的奇偶性没有影响. 然后把一个个小环输出即可,具体的我也不知道怎么输,题目没讲清楚,我按着题解的来的. # ...
- MapReduce框架中的Shuffle机制
Shuffle是map和reduce中间的数据调度过程,包括:缓存.分区.排序等. Shuffle数据调度过程: map task处理hdfs文件,调用map()方法,map task的collect ...
- java多线程之并发编程
1.并发不一定比串行更快 因为并发有线程创建和上下文切换的开销 2.java的并发采用内存共享模型 3.单线程中重排序不会影响到结果 但多线程中重排序可能会影响到结果 4.votaile变量 当线程A ...
- 第五篇 jQuery特效与动画
5.1 show()与hide()方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- SDX Instance Resource Assignment Guide 1 of 2
SDX Instance Resource Assignment Guide 1 of 2 Memory and vCPU Requirements for NetScaler VPX https:/ ...
- [转载]布隆过滤器(Bloom Filter)
[转载]布隆过滤器(Bloom Filter) 这部分学习资料来源:https://www.youtube.com/watch?v=v7AzUcZ4XA4 Filter判断不在,那就是肯定不在:Fil ...
- LeetCode——等差数列划分
题目: 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为等差数列: 1, 3, 5, 7, 97, 7, 7, 73, -1, -5, -9 以下数列 ...
- python cv2截取不规则区域图片
知识掌握 cv2.threshold()函数: 设置固定级别的阈值应用于多通道矩阵,将灰度图像变换二值图像,或去除指定级别的噪声,或过滤掉过小或者过大的像素点. Python: cv2.thresho ...
- 三种Shell脚本编程中避免SFTP输入密码的方法
最近编程中用到sftp上传文件,且需要用crontab预设定时上传事件.而sftp不同于ftp,没有提供选项如 -i 可以将密码直接编码进程序.使用sftp指令,会自动请求用户输入密码. 总结一下可以 ...