Appearance
装饰器模式
意图
动态地给对象添加额外职责,比子类更灵活。多个装饰器可嵌套。
类图
Java 示例
java
public interface Coffee {
String desc();
int costCents();
}
public class SimpleCoffee implements Coffee {
public String desc() { return "Coffee"; }
public int costCents() { return 100; }
}
public abstract class CoffeeDecorator implements Coffee {
protected final Coffee wrappee;
protected CoffeeDecorator(Coffee c) { this.wrappee = c; }
public String desc() { return wrappee.desc(); }
public int costCents() { return wrappee.costCents(); }
}
public class Milk extends CoffeeDecorator {
public Milk(Coffee c) { super(c); }
public String desc() { return wrappee.desc() + ", Milk"; }
public int costCents() { return wrappee.costCents() + 30; }
}
public class Sugar extends CoffeeDecorator {
public Sugar(Coffee c) { super(c); }
public String desc() { return wrappee.desc() + ", Sugar"; }
public int costCents() { return wrappee.costCents() + 10; }
}
// Coffee c = new Sugar(new Milk(new SimpleCoffee()));JDK:java.io.BufferedInputStream 装饰 InputStream。
与代理的区别
装饰器强调叠加功能;代理强调控制访问(延迟加载、权限等)。
下一节:外观模式