ほとんどの人はデコレータパターンのピザ/コーフィーの例を知っています。デコレータパターンでの装飾の順序
Pizza* pizza1 = BigPizzaDecorator(MushromDecorator(SimplePizza()));
Pizza* pizza2 = MushromDecorator(BigPizzaDecorator(SimplePizza()));
あなたが非可換演算を持っている場合、2つのオブジェクトは、例えば、特に、ない完全に同じように動作しますが、:
BigPizzaDecorator::price() { return 10 + PizzaDecorator::price(); } // this is commutative
BigPizzaDecorator::name() { return "big " + PizzaDecorator::name(); } // this is not commutative
のでpizza1
とpizza2
ための価格が同じですしかし、名前はありません。例えば、最初の数字は"Big mushroom pizza"
、次の数字は"Mushroom big pizza"
です。最初は英語が正しいです(おそらく "キノコ付きのビッグピザ"が良いでしょうが、あまり重要ではありません)。
著書「ヘッド最初の」ポイントアウトCOFEE例でこの問題:あなたはデコレータチェーンに複数の層で覗き見する必要があるとき
、あなた は、その真の意図を超えてデコレータをプッシュし始めています。
しかし、このようなことも可能です。最終decriptionを解析し、として「モカ、鞭、 モカ」印刷することができますCondimentPrettyPrint デコレータ想像「ムチ、ダブルモカ」を
それを行うための最善の方法は何ですか? operator<
?
「pizza1.name()」と「pizza2.name()」に同じ出力が必要な点は重要ではありません。 –