设计模式-装饰者模式
2018-02-21 12:46
429 查看
装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
用图片来表示大概是这样:
<
4000
br>
(图片取自:https://segmentfault.com/a/1190000008305233)
举个粟子:
假设我们是一间奶茶店的老板,有牛奶,绿茶,果汁三种饮品,三种饮品才可以自由添加白糖、椰果、珍珠。
例如:双倍白糖梛果牛奶
我们可以利用装饰者模式者模式来完成这种需求。
首先,我们给所有的奶茶设计一个父类(被装饰者),所有饮品都继承于它
有了上面两个类之后,我们可以设计饮品类和加料类了
接下来就是加料类
最后,我们就可以进行测试啦! 我们来弄一杯双倍白糖梛果牛奶试试。
运行结果如下:
成功运行。
使用这种模式的优点:
1. 装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰者模式可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
用图片来表示大概是这样:
<
4000
br>
(图片取自:https://segmentfault.com/a/1190000008305233)
举个粟子:
假设我们是一间奶茶店的老板,有牛奶,绿茶,果汁三种饮品,三种饮品才可以自由添加白糖、椰果、珍珠。
例如:双倍白糖梛果牛奶
我们可以利用装饰者模式者模式来完成这种需求。
首先,我们给所有的奶茶设计一个父类(被装饰者),所有饮品都继承于它
public abstract class Drink { String description = "Drink"; //饮料的说明 public String getDescription() { return description; } //饮料的价格 public abstract double cost(); } //接着,我们设计一个装饰者类,它继承于Drink类,且它为所有添加料的父类 public abstract class Decorator extends Drink{ public abstract String getDescription(); }
有了上面两个类之后,我们可以设计饮品类和加料类了
//牛奶类 public class Milk extends Drink { public Milk() { description = "Milk" + " Add:"; } public double cost() { return 5.0; } } //果汁类 public class Juice extends Drink { public Juice() { description = "Juice" + " Add:"; } public double cost() { return 3.0; } } //绿茶类 public class GreenTea extends Drink { public GreenTea() { description = "Green Tea" + " Add:"; } public double cost() { return 4.0; } }
接下来就是加料类
//白糖类 public class Sugar extends Decorator { Drink drink; //用一个实例变量记录被装饰者(在本例中是饮品) //构造方法 public Sugar(Drink drink) { this.drink = drink; } public String getDescription() { return drink.getDescription() + " Sugar"; } //用被装饰者的价格再加上自己的价格 public double cost() { return drink.cost() + 0.2; } } //珍珠类 public class Bubble extends Decorator { Drink drink; public Bubble(Drink drink) { this.drink = drink; } @Override public String getDescription() { return drink.getDescription() + " Bubble"; } @Override public double cost() { return drink.cost() + 0.5; } } //梛果类 public class Coconut extends Decorator { Drink drink; public Coconut(Drink drink) { this.drink = drink; } @Override public String getDescription() { return drink.getDescription() + " Coconut"; } @Override public double cost() { return drink.cost() + 1.0; } }
最后,我们就可以进行测试啦! 我们来弄一杯双倍白糖梛果牛奶试试。
public class DrinkShop { public static void main(String[] args) { Drink drink = new Milk(); drink = new Sugar(drink); drink = new Sugar(drink); drink = new Coconut(drink); System.out.println(drink.getDescription() + ", Sum: " + drink.cost() ); } }
运行结果如下:
成功运行。
使用这种模式的优点:
1. 装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰者模式可以提供比继承更多的灵活性。
2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
相关文章推荐
- 设计模式——装饰者模式
- java设计模式之------装饰者模式
- 【设计模式】——装饰者模式
- 设计模式—装饰者模式
- 设计模式之适配器模式与装饰者模式
- 用过滤器和装饰者设计模式(静态代理)解决getParameter乱码问题
- Head First 设计模式学习——装饰者模式
- ABAP与设计模式之装饰者模式
- 设计模式(三)装饰者模式
- 设计模式: Decorator 装饰者(java)
- JAVA设计模式——装饰者模式
- java基础_设计模式_装饰者模式
- js设计模式——装饰者模式
- PHP设计模式之装饰者模式
- 设计模式 - 装饰者模式
- [知了堂学习笔记]设计模式之装饰者模式
- 装饰者模式(Decorator Pattern)——给爱用继承的人一个全新的设计眼界
- 设计模式——装饰者模式
- JAVA 设计模式 --- 装饰者模式
- 设计模式 装饰者模式 带你重回传奇世界