当前位置:网站首页>装饰者模式
装饰者模式
2022-08-10 17:36:00 【老蛙@】
咖啡问题
现需要完成一个咖啡下单的问题:
- 咖啡种类:Espresso、ShortBlack、LongBlack、Decaf
- 调料:Milk、Soy、Chocolate
- 要求在扩展新的咖啡种类时,具有良好的扩展性,改动方便
- 使用OO来计算不同种类咖啡的费用,客户可以点单品咖啡,也可以单品咖啡+调料组合
装饰者模式
基本介绍
- 装饰者模式能够动态的将新的功能附加到对象上,在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则
- 装饰者模式装饰者模式就像打包一个快递,其中包含主体(即打包的物品);以及包装(快递包装外壳);一个主体可以由多个包装嵌套装饰
装饰者模式解决咖啡问题

/*** * @author shaofan * @Description 装饰者模式解决咖啡问题 */
public class CoffeeBar {
public static void main(String[] args) {
// 一份牛奶,两份巧克力的Espresso
// 不带任何配料的咖啡,装饰者中的主体
Drink order = new Espresso();
// 加入一份牛奶,使用牛奶装饰主体
order = new Milk(order);
// 加入一份巧克力,使用巧克力再次装饰
for(int i=0;i<2;i++){
order = new Chocolate(order);
}
System.out.println(order.cost());
System.out.println(order.getDescription());
}
}
abstract class Drink{
private String desc;
private double price;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
abstract double cost();
abstract String getDescription();
}
class Decorator extends Drink{
private Drink drink;
public Decorator(Drink drink){
this.drink = drink;
}
@Override
double cost() {
return super.getPrice()+drink.cost();
}
@Override
String getDescription() {
return drink.getDescription()+"+"+super.getDesc();
}
}
class Coffee extends Drink{
@Override
double cost() {
return super.getPrice();
}
@Override
String getDescription() {
return getDesc();
}
}
class Espresso extends Coffee{
private final String DESC = "Espresso";
private final double PRICE = 5.0;
public Espresso(){
super.setDesc(DESC);
super.setPrice(PRICE);
}
}
class ShortBlack extends Coffee{
private final String DESC = "ShortBlack";
private final double PRICE = 5.0;
public ShortBlack(){
super.setDesc(DESC);
super.setPrice(PRICE);
}
}
class Chocolate extends Decorator{
private final String DESC = "Chocolate";
private final double PRICE = 1.0;
public Chocolate(Drink drink){
super(drink);
super.setDesc(DESC);
super.setPrice(PRICE);
}
}
class Milk extends Decorator{
private final String DESC = "Milk";
private final double PRICE = 2.0;
public Milk(Drink drink){
super(drink);
super.setDesc(DESC);
super.setPrice(PRICE);
}
}
源码分析
在Java的IO中,FilterInputStream就是一个装饰者

它的内部组合了一个InputStream,对FileInputStream、StrintgBufferInputStream、ByteArrayInputStream这些主体进行装饰,提供一些额外的功能
边栏推荐
- Your local docbook2man was found to work with SGML rather than XML
- WebRTC源码分析 nack详解
- excel的lookup函数查找匹配关键字的坑
- 验算移位距离和假设的通用性
- fastjson chain analysis (1.2.22-47)
- 【图像分割】基于元胞自动机实现图像分割附matlab代码
- 迪文发布新款2K高清DGUS智能屏
- Making Pre-trained Language Models Better Few-Shot Learners
- PS2手柄通讯协议解析—附资料和源码「建议收藏」
- Toronto Research Chemicals BTK抑制剂丨ACP-5197
猜你喜欢

Colocate Join :ClickHouse的一种高性能分布式join查询模型

「Web应用架构」轮询,SSE 和WebSocket,如何选择合适的?

成为一个优秀的测试工程师需要具备哪些知识和经验?

【燃】是时候展现真正的实力了!一文看懂2022华为开发者大赛技术亮点

Wuling Hongguang MINI EV, the only drawback is safety

Toronto Research Chemicals萜烯分析丨(+)-柠檬烯

「企业架构」企业架构师,解决方案架构师和软件架构师有何不同

HarmonyOS自动化测试框架—Hypium

Toronto Research Chemicals 双(乙酰丙酮)铂(II)

如何学习性能测试?
随机推荐
Talking about Taishan crowdfunding system development technical description and dapp chain crowdfunding system development analysis
期货开户前要第一时间确认手续费
leet面试150
Talk about cloud native data platform
不止跑路,拯救误操作rm -rf /*的小伙儿
pip安装时 fatal error C1083 无法打开包括文件 “io.h” No such file or directory
vvic API 接入说明
未来5年的9大技术趋势
直播回顾|多云时代,如何建设企业级云管理平台?(附建设指南下载)
redis分布式锁
PS2手柄通讯协议解析—附资料和源码「建议收藏」
还在用 Xshell?你 out 了,推荐一个更现代的终端连接工具,好用到爆!
五菱宏光MINI EV,唯一的缺点就是安全性
网络可观测性:让您的网络监控更上一层楼|TechGenix
老板加薪!看我做的WPF Loading!!!
R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化分组散点图、stat_mean函数在分组数据点外侧绘制凸包并突出显示分组均值点、自定会均值点的大小以及透明度
【图像去雾】基于颜色衰减先验的图像去雾附matlab代码
初始网络原理
瑞虎8 PRO产品性能分析,一文读懂究竟何为“全域动力科技旗舰”
【2011】【论文笔记】用THz-TDS观察水树——