Java设计模式之装饰器模式简单介绍
来源:互联网 发布:苹果电脑办公软件下载 编辑:程序博客网 时间:2024/05/17 07:15
版权声明:本文是Kervin2的原创文章,欢迎批评指教。QQ:1991861807
本菜也是正在处于学习阶段,对于遗漏与讲错的知识点欢迎批评指教,qq1991861807
在介绍这个模式之前有句话我分享给大家:“利用继承设计子类的行为,是在编译时决定的,而且所有的子类都会继承到相同的行为。然而,如果能够利用组合的做法扩展对象的行为,就可以在运行时动态拓展”
适用场景:当我们想让类容易扩展,在不修改现有代码的情况下,就可搭配新的行为,可以接受新的功能来应对改变的需求。
类图(没用过几次visio,画的贼丑):
从这个类图中我们可以看到:装饰者和被装饰者必须是一样的类型,也就是有共同的超类,这是相当关键的地方。在这里,我们利用继承达到“类型匹配”,而不是利用继承获得行为。
基类:
public abstract class Beverage { String description = "无饮料"; public String getDescription() { return description; } public abstract double cost();}
装饰者抽象类:
public abstract class CondimentDecorator extends Beverage{ public abstract String getDescription();}
被装饰者类:
public class Espressp extends Beverage { public Espressp() { description = "浓缩咖啡"; } @Override public double cost() { // 最后,我们计算浓缩咖啡的价格,现在不需要计算调料的价格,直接把浓缩咖啡的价格返回即可 return 1.99; }}
public class HouseBlend extends Beverage { public HouseBlend() { description = "深培咖啡"; } @Override public double cost() { // 最后,我们计算浓缩咖啡的价格,现在不需要计算调料的价格,直接把浓缩咖啡的价格返回即可 return 0.89; }}
装饰者实现类:
//摩卡是一个装饰者,所以让他扩展自CondimentDecoratorpublic class Mocha extends CondimentDecorator { Beverage beverage; public Mocha(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ":搭配摩卡,"; } @Override public double cost() { // TODO Auto-generated method stub return 0.20 + beverage.cost(); }}
//摩卡是一个装饰者,所以让他扩展自CondimentDecoratorpublic class Whip extends CondimentDecorator { Beverage beverage; public Whip(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ":搭配豆浆,"; } @Override public double cost() { // TODO Auto-generated method stub return 0.75 + beverage.cost(); }}
//摩卡是一个装饰者,所以让他扩展自CondimentDecoratorpublic class Soy extends CondimentDecorator { Beverage beverage; public Soy(Beverage beverage) { this.beverage = beverage; } @Override public String getDescription() { // TODO Auto-generated method stub return beverage.getDescription() + ":搭配奶泡,"; } @Override public double cost() { // TODO Auto-generated method stub return 0.55 + beverage.cost(); }}
测试类:
public class CoffeeTest {public static void main(String[] args) { Beverage beverage = new HouseBlend(); beverage = new Mocha(beverage); beverage = new Mocha(beverage); beverage = new Soy(beverage); System.out.println(beverage.getDescription()+":"+beverage.cost());}}
输出:
阅读全文
0 0
- Java设计模式之装饰器模式简单介绍
- Java设计模式之装饰器模式
- java设计模式之装饰器模式
- Java设计模式之装饰器模式
- Java设计模式之装饰器模式
- java设计模式之装饰器模式
- java模式设计之装饰器模式
- java设计模式之装饰器模式
- java设计模式之装饰器模式
- Java设计模式之装饰器模式
- Java设计模式之装饰器模式
- java设计模式之装饰模式(装饰器模式/装饰者模式)
- Java设计模式之装饰设计模式
- Java之装饰设计模式
- java设计模式之装饰
- Java设计模式之装饰模式
- Java设计模式之装饰模式
- java设计模式之装饰模式
- Python打印100以内所有素数
- 装饰器(Decorator)
- 使用chrome或firefox的已存在的cookie访问网站
- Linux学习5:环境变量与文件查找
- GsonFormat的使用
- Java设计模式之装饰器模式简单介绍
- 《不负韶华》
- leetcode-598. Range Addition II
- 文本框中 只能显示2位整数
- Element UI DatePicker 日期选择器
- 有 1、2 、3 、4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
- 设置开机自启动并重启
- Android查看.jks文件信息
- java 连接 sqlserver