2016-05-17 11 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; 
    } 
} 

方法1は、このようなデコレータシステムを設計だろう、私はWithMilkデコレータが存在する場合は、私のWithMoch​​aコストがsomeAttributeを使用すると仮定しますか?

デコレータパターンは最善のアプローチですか?

答えて

2

コーヒーのインスタンスをデコレータにキャストすると、Liskovs substution principleに違反する可能性があります。

あなたの質問は、あなたが解決したい本当の問題を詳述しないので、適切な答えを与えるのは難しいです。

Builder patternが異なる部分が相互作用できる場所にオブジェクトを構築する場合は、はるかに優れた方法です。

+0

ビルダーのパターンは面白そうですが、私はそれを見て、感謝! – Woofas

+0

キャスティングはリスコフの代用に違反しない。 2つの概念はほぼ直交しています。キャストには構文的な置換が含まれ、Liskovの原理には意味的な置換が含まれます。 – jaco0646

+0

@ jaco0646:(NotSupportedExceptionのように)基本クラスがスローしない例外を投げるかどうかによって決まります – jgauffin