设计模式--装饰者模式

news/2024/10/18 2:26:53/

问题

  星巴克可乐订单

(1) 可乐种类/单品可乐 :BaiShiCola(百事可乐) FeiChangCola(非常可乐) CoCola(可口可乐)

(2) 调料/附品: Milk  Chocolate

(3) 要求在扩展新的可乐种类时 要具有良好的扩展性 改动方便 维护方便

(4) 使用OO的来就算不同之类可乐的费用 客户可以点单品可乐 也可以单品可乐+调料组合

方案1 

(1) drink是一个抽象类 表示饮料

(2) des是对可乐的描述 比如可乐的名字

(3) cost()方法就是计算费用 drink类中为一个抽象方法

(4) Cola就是单品可乐 继承drink 并实现cost()

(5) CoCola&&Milk就是单品可乐+调料 这个组合很多

(6) 问题:这样设计 会有很多类 当我们增加一个单品可乐 或者一个新的调料 类的数量就会倍增 会出现类爆炸

方案2

前面分析的方案1因为可乐单品+调料组合会造成类的倍增 因此可以做改进 将调料内置到Drink类 这样就不会造成类数量过多 从而提高项目的可维护性

说明: milk cholocate可以设计为Boolean 表示是否要添加相应的调料

(1) 方案2 可以控制类的数量 不至于造成很多的类

(2) 在增加或者删除调料种类时 代码的维护量很大

(3) 考虑到用具可以添加多份调料时 可以将 hasMilk返回对应的int

(4) 使用 装饰者模式

基本介绍

装饰者模式 :动态的将新功能附加到对象上 在对象功能扩展方面 它比继承更有弹性 装饰者模式体现了开闭原则(OCP)

代码举例

书写抽象Drink

@Data
public abstract class Drink {private String des; //描述private float price = 0.0f;/*** 计算费用的抽象方法* 具体细节子类来实现* @return*/abstract float cost();
}

单品可乐

public class Cola extends Drink {@Overridefloat cost() {return getPrice();//调用父类抽象方法}
}

具体可乐实现 百事可乐

public class BaiShiCola extends Cola{public BaiShiCola(){setPrice(4.0f);setDes("百事==>"+getPrice()); //父类方法}
}

具体可乐实现 可口可乐

public class CoCola extends Cola{public CoCola(){setPrice(3.0f);setDes("可口可乐==>"+getPrice()); //父类方法}
}

具体可乐实现 非常可乐

public class FeiChangCola extends Cola {public FeiChangCola() {setPrice(2.0f);setDes("非常可乐==>"+getPrice()); //父类方法}
}

装饰器

public class Decorator extends Drink{private Drink drink;Decorator(Drink drink){//组合this.drink = drink;}@Overridefloat cost() {//getPrice 本身价格return getPrice()+drink.cost();}@Overridepublic String getDes() {//drink.getDes() 输出被装饰者信息return super.getDes()+"==>"+getPrice()+"&&"+drink.getDes();}@Overridepublic float getPrice() {return super.getPrice();}
}

具体的装饰 巧克力

//具体的装饰 巧克力
public class Chocolate extends Decorator {Chocolate(Drink drink){super(drink);setDes("巧克力");setPrice(3.0f);//调味品的价格}
}

具体的装饰 牛奶

public class Milk extends Decorator {Milk(Drink drink){super(drink);setDes("牛奶");setPrice(5.0f);//调味品的价格}
}

测试

 


http://www.ppmy.cn/news/55561.html

相关文章

得帆智改数转系列《SAP新一代集成白皮书》-关于得帆云DeFusion融合集成iPaaS平台

关于得帆云DeFusion融合集成iPaaS平台 融合了企业集成常用的数据集成ETL、应用集成ESB、能力开放API三个核心引擎为一体的企业级集成平台。DeFusion基于底层可自由扩展的连接器为企业提供业务系统全方位互联互通的能力;在此基础上,对企业集成接口的资产汇总、全生命…

性能测评:阿里云服务器ECS通用型g8i实例CPU内存安全存储

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器,3.2 GHz睿频,g8i实例采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…

SpringBoot整合WebSocket详细教程

预期效果 共开启两个页面&#xff0c;实现一对一聊天。 服务端代码&#xff1a;https://gitee.com/lianaozhe/springboot-websocket.git 代码实现逻辑 服务端 导入相关依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><art…

Reid之损失函数理论学习讲解

基于深度学习的Reid主要流程为输入图像-->CNN(提取特征)-->Global average pooling-->特征向量&#xff0c;将用这些特征来衡量图像的相似情况。并用这些特征进行检索&#xff0c;返回分类情况。 在训练网络的时候需要涉及损失函数&#xff0c;因此就引出了表征学习和…

Photoshop如何使用图像调色之实例演示?

文章目录 0.引言1.将一张偏冷调的图像调整成暖调2.将图像调整成不同季节色彩倾向3.变换花朵的颜色4.创建人像轮廓风景5.修饰蓝天白云6.调换花草颜色 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对PS进行了学习&#xff0c;本文通过《Photoshop2021入门教程》及其配…

当影像遇上Python:用MoviePy库轻松搞定视频编辑

I. 简介 当影像遇上Python&#xff1a;用MoviePy库轻松搞定视频编辑 I. 简介II. 安装III. 使用 &#x1f680;&#x1f3ac;1. 创建一个视频剪辑对象2. 剪辑视频3. 剪切视频片段4. 改变视频尺寸和速度5. 合并视频6. 合并多个视频7. 用混合模式合并视频8. 添加音频9. 添加背景音…

C#基础 变量在内存中的存储空间

变量存储空间&#xff08;内存中&#xff09; // 1byte 8bit // 1KB 1024byte // 1MB 1024KB // 1GB 1024MB // 1TB 1024GB // 通过sizeof方法 可以获取变量类型所占的内存空间&#xff08;单位&#xff1a;字节&#xff09; 有…

springboot集成kafka的相关配置及自定义

之前的文章末尾&#xff0c;简单的实现了springboot集成kafka&#xff0c;完成了简单的测试&#xff0c;今天我们来扩展一下相关内容。 首先详解一下配置文件的内容&#xff1a; spring:kafka:# 指定 kafka 地址&#xff0c;我这里部署在的虚拟机&#xff0c;开发环境是Windo…