当前位置:网站首页>装饰者模式
装饰者模式
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这些主体进行装饰,提供一些额外的功能
边栏推荐
- 自动化测试 RobotFramework安装以及使用教程
- 网络可观测性:让您的网络监控更上一层楼|TechGenix
- Kong自定义插件初体验
- Allegro软件Shape菜单下的每个命令的含义
- 华为云连续5年保持中国政务云基础设施市场份额第一…
- 事务的隔离级别,MySQL的默认隔离级别
- 未来5年的9大技术趋势
- WebRTC source code analysis nack detailed explanation
- 期货开户手续费加1分已经是常态
- R语言检验时间序列的平稳性:使用fUnitRoots包中的adfTest函数检验时间序列数据是否具有平稳性(设置参数type为nc时、既不去除趋势也不进行中心化处理)
猜你喜欢
机器人控制器编程实践指导书旧版-实践七 无线通信(网络)
【严重】Nps 鉴权绕过 0day 漏洞
【接入指南 之 直接接入】手把手教你快速上手接入HONOR Connect平台(中)
【云原生| Docker】 部署 Django & mysql 项目
「Web应用架构」轮询,SSE 和WebSocket,如何选择合适的?
Product Description丨MobPush fast integration method on Android side
期货开户前要第一时间确认手续费
施工企业数字化转型解决方案设计思路
不能直接在交易所期货开户
机器人控制器编程实践指导书旧版-实践六 LCD液晶显示(点阵)
随机推荐
DGIOT平台实时展示OPC上报数据全流程代码剖析
R语言ggplot2可视化:使用ggpubr包的ggscatter函数可视化分组散点图、stat_mean函数在分组数据点外侧绘制凸包并突出显示分组均值点、自定会均值点的大小以及透明度
FFmpeg extract H264 nalu from the mp4
AVFrame related api memory management
MySQL增加字段SQL语句
unity 坑坑001
Toronto Research Chemicals 双(乙酰丙酮)铂(II)
Wuling Hongguang MINI EV, the only drawback is safety
机器人控制器编程实践指导书旧版-实践六 LCD液晶显示(点阵)
requires ‘angle‘ attribute to be a multiple of 45
ARM开发(三)ARM寻址方式,异常中断,异常向量表
oracle11g体系结构
网络可观测性:让您的网络监控更上一层楼|TechGenix
JNDI与RMI、LDAP
如何学习性能测试?
JNDI and RMI, LDAP
Before opening a futures account, you must confirm the handling fee as soon as possible
Word里表格跨页时自动断开,表格后留有空白部分,未布满整页,如何操作让表格上下页均匀布满?
多线程与高并发(11)——经典面试题之实现一个容器,提供两个方法,add,size。
成为一个优秀的测试工程师需要具备哪些知识和经验?