重新整理装饰模式,对象实例化

时间:2014-01-29 00:24:26

标签: java

在研究装饰模式时,我陷入了如下基本疑问

背景:http://www.newthinktank.com/2012/09/decorator-design-pattern-tutorial/

  • 披萨 - > interface(PlainPizza& TopingDecorator(抽象类)实现它)
  • TomatoSauce和Mozzarella扩展了TopingDecorator
  • ToppingDecorator有一个实例字段Pizza

问题:代码执行器如何读取以下代码?我试着回答它,请确认它是否正确。

  1. TomatoSauce构造函数创建其对象,将Mozarella对象传递给超级
  2. 它的超级(即TopingDecorator)创建Mozzarella对象(使用其构造函数)将PlainPizza对象作为参数传递给它的super。
  3. 一旦普通比萨饼对象被实例化,它就会存储在Mozzarella对象的实例字段Pizza中。
  4. 然后这个Mozzarella对象存储在TomatoSauce的实例字段中。现在,TomatoSauce对象的实例化已经完成。
  5. 所以,TomatoSauce Object的超级包含Mozzarella对象。 Mozzarella Object的超级对象包含PlainPizza对象。

       Pizza basicPizza = new TomatoSauce(new Mozzarella(new PlainPizza()));
    

1 个答案:

答案 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 doughmozzarella包含tomato sauce行为。

如果您只想用PlainPizza装饰Mozzarella,请执行以下操作而不更改任何实现。

Pizza onlyMozzarella = new Mozzarella(new PlainPizza());

希望它不会让你进一步困惑。