2016-05-17 53 views
2

鑑於典型的咖啡裝飾器示例(從維基百科複製)。如何處理交互裝飾器

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,怎麼會設計這樣一個裝飾系統?

裝飾模式甚至是最好的方法嗎?

回答

2

不,它不是,因爲將咖啡實例投射到裝飾者將違反Liskovs substution principle

由於您的問題沒有詳細說明您想要解決的實際問題,因此很難給出正確的答案。

如果你想構建不同部件可以相互作用的物體,Builder pattern是一個更好的選擇。

+0

建設者模式似乎很有趣,我會看看它,謝謝! – Woofas

+0

施法不違反利斯科夫換人。這兩個概念基本上是正交的。投射涉及句法替換,而Liskov的原則涉及語義替換。 – jaco0646

+0

@ jaco0646:取決於是否拋出基類不拋出的異常(如'NotSupportedException') – jgauffin