




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Java装饰者模式的深入了解一、装饰模式的定义和特点
在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰器模式来实现。
就像我们做菜,需要用到调料,菜,刀,火等一系列抽象的组件来最终完成一道菜。
装饰模式的定义:
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。就增加功能来说,装饰模式比生成子类更加灵活。
特点:
装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
装饰器模式完全遵守开闭原则
缺点
装饰器模式会增加许多子类,过度使用会增加程序得复杂性。
二、装饰模式的结构
装饰模式的结构一般包含以下几个角色
1.抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
2.具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
3.抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
4.具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
图示
三、咖啡点单案例演示
有一个需求,点一杯咖啡需要咖啡,材料等等,这个案例就很适合装饰模式,类似于穿衣,点餐,买包子,等等,我们怎么把他设计成装饰模式呢?
看类图
这个结构就是我已经设计好的一个装饰模式的类图,idea自动生成的,这里的Drink就是我们上面说的抽象构建角色,装饰者是Decorator,他是一个抽象装饰,下面他的子类就是具体的装饰者,那么具体构建中间我们提供了一个中间构建,提供了coffee的一些共性,可以放在这里,用的时候直接继承,他的下面就是相应的具体构件,具体被装饰者角色,装饰者与被装饰者共同继承自component抽象构件,需要用到装饰的就是我们点一杯咖啡,用装饰去包裹即可,层层包裹,案例如下:
比如我要点一份加糖加奶的拿铁咖啡
代码实例:
component抽象构件角色:
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameDrink
*@date2025/12/2810:28
*@Description饮料构件类抽象component
publicabstractclassDrink{
privateStringdescription;
privatefloatprice=0.0f;
publicStringgetDescription(){
returndescription;
publicvoidsetDescription(Stringdescription){
this.description=description;
publicfloatgetPrice(){
returnprice;
publicvoidsetPrice(floatprice){
this.price=price;
*@Date2025/12/2810:30
*@Param
*@Returnfloat
*@MetodNamecost
*@Authorwang
*@Description计算花费,订单价格
publicabstractfloatcost();
}
装饰者类:
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameDecorator
*@date2025/12/2810:40
*@Description装饰者定义类,配料
publicclassDecoratorextendsDrink{
privateDrinkdrink;
*@paramdrink
*@Date2025/12/2810:42
*@Param
*@Returnnull
*@MetodNameDecorator
*@Authorwang
*@Description传入一个被装饰者,由装饰者进行装饰
publicDecorator(Drinkdrink){
this.drink=drink;
*@Date2025/12/2810:43
*@Param
*@Returnfloat
*@MetodNamecost
*@Authorwang
*@Description装饰者的价格加上被装饰者的价格
@Override
publicfloatcost(){
returnsuper.getPrice()+drink.cost();
*@Date2025/12/2810:44
*@Param
*@ReturnString
*@MetodNamegetDescription
*@Authorwang
*@Description输出订单信息,包含装饰者,装饰者的价格,以及被装饰者的信息
@Override
publicStringgetDescription(){
returndrink.getDescription()+\n加入的材料:+super.getDescription()
+\t材料价格:+super.getPrice();
}
装饰者类:
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameDecorator
*@date2025/12/2810:40
*@Description装饰者定义类,配料
publicclassDecoratorextendsDrink{
privateDrinkdrink;
*@paramdrink
*@Date2025/12/2810:42
*@Param
*@Returnnull
*@MetodNameDecorator
*@Authorwang
*@Description传入一个被装饰者,由装饰者进行装饰
publicDecorator(Drinkdrink){
this.drink=drink;
*@Date2025/12/2810:43
*@Param
*@Returnfloat
*@MetodNamecost
*@Authorwang
*@Description装饰者的价格加上被装饰者的价格
@Override
publicfloatcost(){
returnsuper.getPrice()+drink.cost();
*@Date2025/12/2810:44
*@Param
*@ReturnString
*@MetodNamegetDescription
*@Authorwang
*@Description输出订单信息,包含装饰者,装饰者的价格,以及被装饰者的信息
@Override
publicStringgetDescription(){
returndrink.getDescription()+\n加入的材料:+super.getDescription()
+\t材料价格:+super.getPrice();
}
具体构件类:拿铁
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNamelatte
*@date2025/12/2810:32
*@Description拿铁咖啡实类,被装饰者
publicclassLatteextendsCoffee{
publicLatte(){
setDescription(拿铁咖啡
setPrice(15.0f);
}
具体构件类:摩卡
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameMocha
*@date2025/12/2810:36
*@Description摩卡咖啡实类,被装饰者
publicclassMochaextendsCoffee{
publicMocha(){
setDescription(摩卡咖啡
setPrice(12.2f);
}
其他同上,不过多展示
具体装饰类:牛奶
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameMilk
*@date2025/12/2810:47
*@Description牛奶调味品,具体装饰者
publicclassMilkextendsDecorator{
*@paramdrink
*@Date2025/12/2810:42
*@Param
*@Returnnull
*@MetodNameDecorator
*@Authorwang
*@Description传入一个被装饰者,由装饰者进行装饰
publicMilk(Drinkdrink){
super(drink);
setDescription(牛奶
setPrice(1.0f);
}
具体装饰:糖
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNamesugar
*@date2025/12/2810:50
*@Description糖,装饰者
publicclassSugarextendsDecorator{
*@paramdrink
*@Date2025/12/2810:42
*@Param
*@Returnnull
*@MetodNameDecorator
*@Authorwang
*@Description传入一个被装饰者,由装饰者进行装饰
publicSugar(Drinkdrink){
super(drink);
setDescription(糖
setPrice(0.5f);
}
订单测试代码:
packagecom.decoratorPattern.starBucks;
*@authorwang
*@version1.0
*@packageNamecom.decoratorPattern.starBucks
*@classNameOrderTest
*@date2025/12/2810:51
*@Description前台订单类
publicclassOrderTest{
publicstaticvoidmain(String[]args){
//点一份加糖加奶的拿铁咖啡
System.out.println(+++++++没加任何东西+++++++
Drinklatte=newLatte();
System.out.println(当前总价:+latte.cost());
System.out.println(coffee:+latte.getDescription());
//加糖
System.out.println(+++++++加糖后+++++++
latte=newSugar(latte);
System.out.println(当前总价:+latte.cost());
System.out.println(coffee:+latte.getDescription());
System.out.println(+++++++加奶后+++++++
l
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年配电装置市场发展现状分析及行业投资战略研究报告
- 2025-2030年超声理疗设备行业市场深度调研及发展趋势与投资研究报告
- 2025-2030年蓄冷液行业市场深度调研及发展前景趋势与投融资研究报告
- 2025-2030年节能路灯行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030年美术馆产业市场深度分析及发展趋势与投资战略研究报告
- 2025-2030年组合健身器械产业市场深度调研及发展趋势与投资研究报告
- 2025-2030年立体停车设备行业市场深度分析及前景趋势与投资研究报告
- 2025-2030年直流电源行业风险投资发展分析及投资融资策略研究报告
- 2025-2030年白兰地行业风险投资发展分析及投资融资策略研究报告
- 2025-2030年电磁感应干手器行业市场发展现状及发展前景与投资机会研究报告
- 班级管理交流-班主任工作经验交流课件(共28张ppt)
- 人造草坪足球场施工方案
- 重大疾病保险介绍动态PPT
- 工程钻机和潜孔钻机技术参数
- 六年级下册道德与法治课件战争带来的伤害人教部编版市公开课一等奖省课获奖课件
- 模电直流稳压电源
- 标识标牌投标服务方案
- 初中体育课堂学生体质发展及体能锻炼有效措施优秀获奖科研论文
- 2023江苏马鞍山港华燃气限公司招聘14人高频考点题库(共500题含答案解析)模拟练习试卷
- 新高考人教版高中化学必修一全套课件
- JJF 1973-2022 移动生物检测实验舱性能参数校准规范
评论
0/150
提交评论