装饰器设计模式--快餐店案例
装饰器设计模式–快餐店案例
某快餐店提供粉、面等各种快餐,顾客购买时可要求添加其它食物,例如加鸡蛋、加豆腐干、加猪脚等等,快餐店需计算快餐的总价,请用装饰器设计模式解决该问题。
快餐店提供的各种食品抽象为一个抽象类–foods
//抽象构件
public abstract class foods {//获取要计算的商品的名称public abstract String getName();//计算价格public abstract double calculate();//打印名称:价格public abstract void displayPrice();//打印商品描述 包括加了什么public abstract String getDescription();
}
具体构件–快餐店具体提供的食品
public class BeefNoodles extends foods {private String name = "牛肉面";private double price = 10;public String getName() {return name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic double calculate() {return this.price;}@Overridepublic void displayPrice() {System.out.println((this.name + " : " + this.calculate()));}@Overridepublic String getDescription() {return this.name;}
}
装饰角色–需有一个私有的变量指向抽象构件
//抽象装饰者
public abstract class Decorator extends foods{private foods noodle = null;//构造函数传递被装饰者public Decorator(foods noodle){this.noodle = noodle;}@Overridepublic String getName(){return this.noodle.getName();}@Overridepublic double calculate(){return this.noodle.calculate();}@Overridepublic void displayPrice(){this.noodle.displayPrice();}@Overridepublic String getDescription(){return this.noodle.getDescription();}
}
装饰器的具体实现
public class AddEgg extends Decorator {//定义被修饰者private String addname = "鸡蛋";private double EggPrice = 0.5;public AddEgg(foods noodle) {super(noodle);}private double addegg(){return this.EggPrice;// System.out.println("这里加了一个鸡蛋");}@Overridepublic double calculate() {return super.calculate() + this.addegg();}@Overridepublic void displayPrice(){System.out.println(( this.getName() + " : " + this.calculate()));}@Overridepublic String getName(){return super.getName();}@Overridepublic String getDescription(){return super.getDescription() + " + " + this.addname;}
}
测试方法
public class testmain {public static void main(String[] args) {//买一碗牛肉面foods noodle = new BeefNoodles();
// noodle.displayPrice();//加鸡蛋 0.5noodle = new AddEgg(noodle);
// noodle.displayPrice();//再加一个豆腐干 1.5noodle = new AddToufu(noodle);
// noodle.displayPrice();//加上猪脚 12noodle = new AddPigFeet(noodle);noodle.displayPrice();System.out.println(noodle.getDescription());//桂林米粉加鸡蛋 加 猪脚foods ricenoodles = new AddPigFeet(new AddEgg(new Vermicelli()));ricenoodles.displayPrice();System.out.println(ricenoodles.getDescription());}
}
感谢大佬文章《java与设计模式》之装饰模式详解&Java IO中的装饰器模式
装饰器设计模式--快餐店案例相关推荐
- 装饰器设计模式代码套路-咖啡加奶
装饰器设计模式具体操作: 1.抽象组件:需要装饰的抽象对象(接口或抽象父类) 2.具体组件:需要装饰的对象 3.抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法 4.具体装饰类:被装饰的对象 案 ...
- java设计模式之装饰模式_Java中的装饰器设计模式
java设计模式之装饰模式 装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模 ...
- lambda设计模式_使用lambda的装饰器设计模式
lambda设计模式 随着Java中lambda的出现,我们现在有了一个新工具,可以更好地设计我们的代码. 当然,第一步是使用流,方法引用和Java 8中引入的其他简洁功能. 展望未来,我认为下一步是 ...
- 装饰着模式示例_装饰器设计模式示例
装饰着模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原 ...
- Java中的装饰器设计模式
装饰器设计模式允许在运行时将附加职责或行为动态附加到对象. 它是一种结构模式,利用聚合来组合这些行为. 在本教程中,我们将学习实现装饰器模式. UML图: 让我们从装饰器模式的UML表示开始: Con ...
- 装饰器设计模式的应用
嗨,您好! 今天,我将展示装饰设计模式的实际应用. 装饰器设计模式是一种广泛使用的设计模式,同时在运行期间处理图形,树木和动态更改. 如果您正在寻找或尝试进行递归,这也是一个不错的选择. 我喜欢它. ...
- 用装饰器设计模式装饰
装饰图案是广泛使用的结构图案之一. 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能. 简而言之,此模式通过包装将附加功能添加到对象. 问题陈述: 想像一下我们有一个比萨饼,该比萨饼已经用番 ...
- 结构设计模式 - 装饰器设计模式
结构设计模式 - 装饰设计模式 装饰器设计模式用于在运行时修改对象的功能.同时,同一类的其他实例不会受此影响,因此单个对象将获得已修改的行为.装饰器设计模式是结构设计模式之一(如Adapter Pat ...
- java 设计模式 示例_Java示例中的装饰器设计模式
java 设计模式 示例 Decorator design pattern is used to modify the functionality of an object at runtime. A ...
最新文章
- 技巧:MyBatis 中的trim标签,好用!
- php随机跳转,Nginx实现404页面跳转到任意随机页面
- MySQL数据库:分区Partition
- 《C++编程风格(修订版)》——2.5 动态内存的一致性
- 结对-结对编项目作业名称-需求分析
- SAP CRM,C4C和Hybris的product Cockpit
- 哪些钱借了可以不还?
- 软件工程——个人课程总结
- CGContext转CC
- OpenCV中cornerSubPixel()亚像素求精原理
- Hadoop:HDFS的概念理解和体系架构-成都加米谷大数据分享
- VisualStudio解决方案配置Debug和Release选项
- 计算图层面积(针对于面要素)ArcObject c++
- golang——channel笔记
- sublime3103 破解及Package Control离线安装
- $PollardRho$ 算法及其优化详解
- 数据结构实验报告一 顺序表与链表
- 扫雷win10_室友玩扫雷通关,在我面前装逼?不存在!用Python开发自动扫雷,五秒通关!...
- 爱老虎油和你探索flash中的对象
- 微信公众号自动回复海报