如何处理交互装饰器

时间:2016-05-17 04:56:02

标签: oop design-patterns decorator

鉴于经典的咖啡装饰示例(从维基百科复制而来)。

public interface Coffee {
    public double getCost();
}

public class SimpleCoffee implements Coffee {
    public double getCost() {
        return 1;
    }
}

public abstract class CoffeeDecorator implements Coffee {
    protected final Coffee decoratedCoffee;
    public CoffeeDecorator(Coffee c) {
        this.decoratedCoffee = c;
    }
    public double getCost() {
        return decoratedCoffee.getCost();
    }
}

class WithMilk extends CoffeeDecorator {
    public WithMilk(Coffee c) {
        super(c);
    }
    public double getCost() {
        return super.getCost() + MILKCOST;
    }
    public int someAttribute;
}

class WithMocha extends CoffeeDecorator {
    public WithMocha(Coffee c) {
        super(c);
    }
    public double getCost() {
        return super.getCost() + MOCHACOST;
    }
}

如果WithMilk装饰器存在,假设我希望我的WithMoch​​a成本使用someAttribute,那么如何设计这样的装饰系统呢?

装饰者模式甚至是最好的方法吗?

1 个答案:

答案 0 :(得分:2)

不,它不是,因为将咖啡实例投射到装饰器会违反Liskovs substution principle

由于您的问题没有详细说明您想要解决的真正问题,因此很难给出正确答案。

如果你想构建不同部分可以互动的对象,Builder pattern是一个更好的选择。