1.定义
装饰者模式将职责附加在一个对象上,如果功能扩展,装饰者模式提供比继承更具弹性的替代方案
2.小栗子(咖啡店案例)
2.1 Coffee.java 咖啡抽象类
public abstract class Coffee {
protected int price;
protected String name;
public int getPrice() {
return this.price;
}
public String getName() {
return this.name;
}
}
2.2 SimpleCoffee.java 普通咖啡类
public class SimpleCoffee extends Coffee {
@Override
public int getPrice() {
return 24;
}
@Override
public String getName() {
return "SimpleCoffee";
}
}
2.3 DecoratorCoffee.java 装饰咖啡类
public class DecoratorCoffee extends Coffee {
protected Coffee coffee;
public DecoratorCoffee(Coffee coffee) {
this.coffee = coffee;
}
@Override
public int getPrice() {
return this.coffee.getPrice();
}
@Override
public String getName() {
return this.coffee.getName();
}
}
2.4 SugarCoffee.java 加糖咖啡类
public class SugarCoffee extends DecoratorCoffee {
public SugarCoffee(DecoratorCoffee decoratorCoffee) {
super(decoratorCoffee);
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
@Override
public String getName() {
return "Sugar + " + super.getName();
}
}
3 测试类
public class DecoratorPatternDemo {
public static void main(String[] args) {
DecoratorCoffee decoratorCoffee = new SugarCoffee(new DecoratorCoffee(new SimpleCoffee()));
System.out.println("NAME:" + decoratorCoffee.getName() + " PRICE:" + decoratorCoffee.getPrice());
}
}
4 总结
看到测试中的代码是不是有点似曾相识,不错java.io.*中,常常会用到类似的代码,其实也是用装饰者模式。它的装饰父类是FilterInputStream/FilterOutputStream,有空去看看流这一块的源码吧。
网友评论