终于把学了好多天的装饰者模式敲了一边,这里记录下来,供以后参考。
书上是这么定义装饰者模式的:装饰者模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
我自己的理解为,就是一组继承同一个抽象类的组合,然后一个把另一个作为成员变量,给包裹起来,也就是装饰起来,因为抽象类里里有共同的抽象方法,所有包装着在自己的方法中,先调用被包装的方法,然后在之上加上自己的属性。
装饰者和被装饰者都要来自同一个抽象类!!!
只是敲了一下例子程序,具体的如果在项目中用到我会再加上来,用一个饮料例子来介绍:
饮料的抽象类,提供抽象的cost()方法。
public abstract class Beverage {
String description;
public String getDescription() {
return description;
}
public abstract double cost();
}
public class HousBlend extends Beverage{
public HousBlend() {
description = "HousBlend Cofee";
}
@Override
public double cost() {
return 10;
}
}
咖啡的调料抽象类:
public abstract class CondimentDecorator extends Beverage{
public abstract String getDescription();
}
具体的调料,在构造方法中将被装饰者作为成员变量包裹在内:
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + "Mocha";
}
@Override
public double cost() {
return beverage.cost() + 1;
}
}
测试的例子:
public class Test {
public static void main(String args[]) {
Beverage coffee = new HousBlend();
System.out.println(coffee.getDescription() + "," +coffee.cost()+ "元");
coffee = new Mocha(coffee);
coffee = new Mocha(coffee);
System.out.println(coffee.getDescription()+ "," +coffee.cost()+ "元");
coffee = new Mocha(coffee);
System.out.println(coffee.getDescription()+ "," +coffee.cost()+ "元");
}
}
显示的结果:
HousBlend Cofee,10.0元
HousBlend CofeeMochaMocha,12.0元
HousBlend CofeeMochaMochaMocha,13.0元
因为还没具体用到,所以理解不是很深刻,但是知道了这种模式,以后碰到用这种模式的时候会接受更快。