设计模式-----装饰模式
来源:互联网 发布:originpro软件下载 编辑:程序博客网 时间:2024/06/05 06:48
装饰模式
个人博客,想要搭建个人博客的可以进来看看: http://www.ioqian.top/
装饰模式,动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案,在Java JDK的io实现中使用了大量的装饰者模式
设计模式系列博客博主源码: https://github.com/liloqian/DesiginModeDemo
背景
我们要帮星巴克提供一个自动打印咖啡信息和价格的软件,比如基础的浓缩咖啡,混合咖啡,每个基础咖啡加了什么调料(几分糖,几分牛奶等等)。如果我们对每种咖啡具体实现,这简直是类爆炸,每个人有自己的咖啡配料方式,要写几万个类… 我们这里要是有装饰模式
我们先来看一下装饰者模式的UML
通过我们的背景来生动的描述
结合UML和我们的模拟场景说明一下
- Component 公共父类,这里就是我们的咖啡父类,下面的调料和基本咖啡类型都要继承Component
- ConcreteComponent 被装饰者,相当于我们的基本咖啡类型我们有两种
- Decorator,装饰者 ,相当于调料接口,这个接口的任意实现都可以包装咖啡父类的实现者,我这里也用了接口
- ConcreateDecoratorA ,这里相当于上图右下角的牛奶加糖的浓缩咖啡,一个装饰例子
装饰者模式的特点
- 装饰者和被装饰者有共同的超类型
- 装饰对象包含一个真实对象的引用
- 可以用多个装饰对象包装一个被装饰对象
- 对象可以在任何时候被装饰
下面来看代码实现,就是上面我们的模拟情景
公共父类的实现
//装饰者和被装饰者的公共父类public abstract class Beverage { //父类状态描述 String description = "Base Beverage"; //具体的价格让基本咖啡类型加上装饰者的价格确定 public abstract double cost(); public String getDescription() { return description; }}
两种基本咖啡类型,浓缩咖啡和混合咖啡
浓缩咖啡
//浓缩咖啡类型 ,继承了父类public class Espresso extends Beverage { public Espresso() { description = "Espresso coffee"; } //浓缩咖啡的价格 @Override public double cost() { return 1.9; }}
混合咖啡
//混合咖啡public class Blend extends Beverage { public Blend() { description = "Blend coffee"; } //混合咖啡价格 @Override public double cost() { return 2.9; }}
调料接口
//调料接口,和基本咖啡类型有共同的父类public abstract class Spices extends Beverage { public abstract String getDescription();}
调料糖
public class Sugar extends Spices { Beverage beverage; //我们用父类,不要基本的咖啡类型 public Sugar(Beverage beverage) { this.beverage = beverage; } //修饰咖啡名称状态, 修饰属性+基本属性 @Override public String getDescription() { return "Sugar " + beverage.getDescription(); } //修饰咖啡价格 糖的价格加上自身本来价格 @Override public double cost() { return .5 + beverage.cost(); }}
调料牛奶,和上面类似
public class Milk extends Spices { Beverage beverage; public Milk(Beverage beverage) { this.beverage = beverage; } @Override public double cost() { return 0.3 + beverage.cost(); } @Override public String getDescription() { return "Milk "+beverage.getDescription(); }}
main测试
public class Main { public static void main(String[] args) { //普通的混合咖啡 Beverage blend = new Blend(); printInfo(blend); //加了一份牛奶的混合咖啡 Beverage blendMilk = new Milk(blend); printInfo(blendMilk); //加了2份糖的一份牛奶的混合咖啡 Beverage blendMilkSugarTwo = new Sugar(new Sugar(blendMilk)); printInfo(blendMilkSugarTwo); //加了一份糖一份牛奶的浓缩咖啡 Beverage espresson = new Sugar(new Milk(new Espresso())); printInfo(espresson); } //提取打印咖啡的打印方法 private static void printInfo(Beverage beverage){ System.out.println(beverage.getDescription() +" 价格:"+beverage.cost()); }}结果Blend coffee 价格:2.9Milk Blend coffee 价格:3.1999999999999997Sugar Sugar Milk Blend coffee 价格:4.199999999999999Sugar Milk Espresso coffee 价格:2.6999999999999997Process finished with exit code 0
装饰者模式用到的设计原则
开闭原则对扩展开发,对修改关闭原则 , 没有太多的感悟,在后面的源码中寻找想法,欢迎大神用通俗的话语概况
阅读全文
0 0
- 设计模式---装饰模式
- 设计模式:装饰模式
- 设计模式------装饰模式
- 设计模式--装饰模式
- 设计模式--装饰模式
- 设计模式--装饰模式
- 设计模式 装饰模式
- 设计模式----装饰模式
- 设计模式-【装饰模式】
- 设计模式--装饰模式
- 设计模式装饰模式
- 设计模式 - 装饰模式
- 设计模式-----装饰模式.
- 设计模式-----装饰模式.
- [ 设计模式 ] 装饰模式!
- 设计模式:装饰模式
- 设计模式 - 装饰模式
- 设计模式 - 装饰模式
- css复习——常用标签、选择器与优先级、块元素与内联元素 day6
- Android Oreo 中对后台任务的限制
- Fiddler实现手机抓包——小白入门
- PHPWAMP站点管理的“域名模式”和“端口模式”详解、均支持自定义
- 解决新装的linux虚拟机和windows本机不能通信的问题
- 设计模式-----装饰模式
- 1.selenium 发展介绍
- EventBus简单实用
- Spark SQL, DataFrames and Datasets Guide
- 异常处理与多线程
- application registered the JDBC driver [com.mysql] but failed to unregister it when the web app...
- Apk反编译破解及重新打包
- 记录自己的第一篇博客
- js使用变量改变css值