在研究装饰模式时,我陷入了如下基本疑问
背景:http://www.newthinktank.com/2012/09/decorator-design-pattern-tutorial/
问题:代码执行器如何读取以下代码?我试着回答它,请确认它是否正确。
所以,TomatoSauce Object的超级包含Mozzarella对象。 Mozzarella Object的超级对象包含PlainPizza对象。
Pizza basicPizza = new TomatoSauce(new Mozzarella(new PlainPizza()));
答案 0 :(得分:0)
你的理解几乎就在那里。
Pizza basicPizza = new TomatoSauce(new Mozzarella(new PlainPizza()));
PlainPizza
对象Mozzarella
构造函数将通过传递新创建的plainpizza来调用。Mozzarella
构造函数将调用super(newPizza);
,这会将newPizza
设置为ToppingDecorator
的实例变量。Mozzarella
对象创建已完成。 Mozzerella
is-a
Pizza
TomotoSauce
构造函数可以接受它并调用ToppingDecorator
的构造函数并将mozerella
设置为ToppingDecorator
。
现在,来到decorator pattern
,它会更改Pizza
的单个实例的行为。
当您调用方法basicPizza.getDescription();
时,您的输出将为Thin dough, mozzarella, tomato sauce
。这意味着您对Thin dough
和mozzarella
包含tomato sauce
行为。
如果您只想用PlainPizza
装饰Mozzarella
,请执行以下操作而不更改任何实现。
Pizza onlyMozzarella = new Mozzarella(new PlainPizza());
希望它不会让你进一步困惑。