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) 需求 定义咖啡厅中的 ...
随机推荐
- 针对yarn的8088端口攻击
参考: https://www.wangbokun.com/%E8%BF%90%E7%BB%B4/2019/09/02/%E6%8C%96%E7%9F%BF%E7%97%85%E6%AF%92.htm ...
- (电脑重置之后)win10在桌面点右键鼠标一直转圈;无法点击桌面图标;
昨天重置系统之后,发现了这个毛病.桌面任务栏都能正常点击,就是一到桌面,无法点击桌面上面的图标(刚开机的时候还可以点).想新建文件夹来着,一点右键,鼠标即开始转圈圈.本来以为自己能好,结果第二天了还这 ...
- P4942小凯的数字
给定一个序列,如12345 56789 1011121314等,输出对其取余9的结果. 那么我们需要明白一个定理,一个序列对一个数的取余结果等于它各位之和取余那个数的结果.证明似乎是这样∑i=0na ...
- Windows系统下同时安装Python2和Python3
Windows系统下同时安装Python2和Python3 说明 有时由于工作需求我们需要在Python2版本下面进行一些开发,有时又需要Python3以上的版本,那么我们怎么在一台电脑上同时安装多个 ...
- 附录3:RMA算法原理
RMA算法分三步: 一.背景校正(没精力写了) 二.归一化(没精力写了) 三.计算表达值 假设有5张芯片,这些芯片的某个探针组包含5个探针,它们的表达值如下: GeneChip 4 8 6 9 7 3 ...
- Scala学习二——控制结构和函数
一.if表达式有值 val s=if(x>0) 1 else -1,相当于Java中x>0?1:-1(不过不拿呢个在?:中插入语句),而且Scala中可以用混合类型(如if (x>0 ...
- luogu P3826 [NOI2017]蔬菜
luogu 那个第一次购买有\(s_i\)奖励,可以看成是多一种蔬菜\(i+n\),权值为\(w_i+s_i\),每天减少量\(x\)为0个,保质期\(\lceil\frac{c_i}{x_i}\rc ...
- ShuffleNet系列学习笔记
ShuffleNet是旷世提出的高效轻量化网络,是一款很值得一提的轻量化网络,其相关论文也是很有价值的. ShuffleNet V1 该网络提出于2017年,论文为<ShuffleNet: An ...
- yum 报错3
. Contact the upstream for the repository and get them to fix the problem. . Reconfigure the baseurl ...
- jmeter使用jdbc连接mysql数据库遇到的问题
问题一.已将myql的jar包放在jmeter5.1的lib目录下并重启过jmeter,连接数据库提示 Cannot create JDBC driver of class 'com.mysql.jd ...