【发布时间】:2017-06-11 22:11:14
【问题描述】:
对于装饰器设计模式,GoF 明确指出:
使用装饰器,可以在运行时添加和删除职责 只需连接和分离它们。
我正在尝试用 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 好问题。我以前从未使用过 Decorator 模式来 detach 职责,但这绝对是该模式的有效用例。请参阅我的答案以获得解释。
标签: c++ design-patterns decorator