Skip to content

装饰器模式

意图

动态地给对象添加额外职责,比子类更灵活。多个装饰器可嵌套。

类图

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

与代理的区别

装饰器强调叠加功能;代理强调控制访问(延迟加载、权限等)。

下一节:外观模式