Oop 如何处理交互装饰器
给出了经典的咖啡装饰器示例(摘自维基百科) 假设我希望我的WithMocha cost使用某些属性,如果WithMilk装饰器存在,人们将如何设计这样一个装饰器系统Oop 如何处理交互装饰器,oop,design-patterns,decorator,Oop,Design Patterns,Decorator,给出了经典的咖啡装饰器示例(摘自维基百科) 假设我希望我的WithMocha cost使用某些属性,如果WithMilk装饰器存在,人们将如何设计这样一个装饰器系统 decorator模式是最好的方法吗?不是,因为向decorator抛出咖啡实例会违反 因为你的问题没有详细说明你想要解决的真正问题,所以很难给出正确的答案 如果您想构造不同部分可以交互的对象,则可以选择“构建器”模式。构建器模式似乎很有趣,我来看看,谢谢!铸造不违反Liskov替换。这两个概念基本上是正交的。强制转换涉及语法替换,
decorator模式是最好的方法吗?不是,因为向decorator抛出咖啡实例会违反 因为你的问题没有详细说明你想要解决的真正问题,所以很难给出正确的答案
如果您想构造不同部分可以交互的对象,则可以选择“构建器”模式。构建器模式似乎很有趣,我来看看,谢谢!铸造不违反Liskov替换。这两个概念基本上是正交的。强制转换涉及语法替换,而Liskov的原则涉及语义替换。@jaco0646:取决于是否引发基类未引发的异常(如
NotSupportedException
),子类方法违反或不违反Liskov替换。强制转换子类的引用类型无法更改该事实。
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;
}
}