装饰者模式的定义:
装饰者模式:动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
Java实现
借用《Head First设计模式》 中的咖啡店卖咖啡的样例。便于说明,这里简洁一下。假如我要写一个咖啡点单计价的软件。业务逻辑是这样的,一杯咖啡10元,如果加糖另外加1元,如果加奶另外加两元。实际来讲,采用硬编码的方式我可以写三个类来实现该需求:1.咖啡单买;2.咖啡+糖;3.咖啡+奶。然后就完事儿,任务完成。但是如果哪一天,老板打算卖即加糖又加奶的咖啡的话,就得再增加一个类来实现该类型咖啡的计价。这还好说,假如我有多种类型的咖啡呢?而且每种类型的咖啡都可以加奶或者糖,这样排列组合下去,我估计要写吐血…..
下面,我们就使用装饰者模式来解决该问题。
样例
首先来一个咖啡的抽象类
1
2
3
4
5
6
7
8
9
10 public abstract class AbsCoffee {
//咖啡描述
String description = "Unknown Type";
public String getDescription() {
return description;
}
//咖啡加个
public abstract double cost();
}
接下来两种咖啡的实现
1
2
3
4
5
6
7
8
9
10 public class MochaCoffee extends AbsCoffee{
public MochaCoffee() {
description = "摩卡咖啡";
}
public double cost() {
//摩卡咖啡10元一杯
return 10;
}
}
1 | public class LatteCoffee extends AbsCoffee{ |
装饰器
1 | //装饰器 |
两个装饰类,这里分别为咖啡的调调:糖、牛奶
1 | public class Sugar extends Decorator{ |
1 | public class Milk extends Decorator{ |
测试结果
1 | public class Test { |
java.io中的装饰者模式
这里的代码样例来自与《Head First设计模式》一书,演示了FileInputStream
中装饰者模式的使用
1 | //实现字符的大小写转换 |
1 | public class InputTest { |
Javascript实现
1 | (function () { |
上一篇:设计模式系列之三观察者模式
下一篇:设计模式系列之五工厂模式