を取り外し、GoFのがはっきりと述べている:デコレーターでDecoratorパターンは:デコデザインパターンについては責任
を、責任は、単にそれらを着脱することにより、実行時 で追加および削除することができます。
私はこのパターンがデコレートされていないオブジェクトにどのように責任を加えることができるのかを簡単に見ることができるC++でスケルトンコードを作成しようとしています。
私の質問は、どのように特定の責任を取り除くことができますか?最後にラップされた責任の削除は簡単に行うことができます。しかし、間に追加された責任を取り除くこともできますか?ここで
は私のサンプルコードです:
class Icecream { //Component
public :
virtual void addToppings() = 0 ;
virtual Icecream *getUndecorated() = 0 ;
} ;
class PlainIcecream : public Icecream { //Concrete Component
public :
void addToppings() { cout<<"I am just plain icecream, you may add more flavors\n" ; }
Icecream * getUndecorated() {return this ; }
} ;
class Topping : public Icecream { //Decorator
protected :
Icecream *icecream ;
public :
Topping(Icecream *i) : icecream(i) {}
void addToppings() { icecream->addToppings() ; }
} ;
class PeanutToppings : public Topping { //Concrete Component A
public :
PeanutToppings(Icecream *i) : Topping(i) {}
void addToppings() {
Topping::addToppings() ;
cout<<"Adding peanut toppings for great taste\n" ;
}
Icecream * getUndecorated() {return icecream ; }
} ;
class CandyToppings : public Topping { //Concrete Component A
public :
CandyToppings(Icecream *i) : Topping(i) {}
void addToppings() {
Topping::addToppings() ;
cout<<"Adding candy toppings for yummy flavour\n" ;
}
Icecream * getUndecorated() {return icecream ; }
} ;
main() {
Icecream *icecream_with_candy_and_peanuts = new CandyToppings(new PeanutToppings(new PlainIcecream)) ;
icecream_with_candy_and_peanuts->addToppings() ;
cout<<"_________________________________________________\n" ;
Icecream *icecream_with_only_peanuts = icecream_with_candy_and_peanuts->getUndecorated() ;
icecream_with_only_peanuts->addToppings() ;
cout<<"_________________________________________________\n" ;
Icecream *icecream_plain = icecream_with_only_peanuts->getUndecorated() ;
icecream_plain->addToppings() ;
}
今、私はicecream_with_candy_and_peanuts
からトッピングだけお菓子とアイスクリームを持っていることが可能であるかどうかを知りたいです。なぜ私はそうしたいのではないか考えてください。私はちょうどGoFの中で述べたように
が責任
を取り外す用語を理解しようとしています。
最後のラップの責任を削除
トッピングは本当にアイスクリームではないので、デザインに欠陥があるようです。継承は「関係」であることを忘れないでください。 –
@プログラマの中には、基本クラス、派生クラスと考えることができます。私はすでに、クラス名ではなく、GoFで述べたように、装飾オブジェクトからの責任を取り除くことが懸念されていることをすでに述べました。あなたはこれらのクラスに名前をつけたいと思っています。 – user3282758
@プログラマの人は、あなたが考えてほしいスケルトンであり、クラス名はまったく意味がありません。 – user3282758