Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何处理交互装饰器_Oop_Design Patterns_Decorator - Fatal编程技术网

Oop 如何处理交互装饰器

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

给出了经典的咖啡装饰器示例(摘自维基百科)

假设我希望我的WithMocha cost使用某些属性,如果WithMilk装饰器存在,人们将如何设计这样一个装饰器系统


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;
    }
}