与装饰员的设计模式

时间:2018-04-01 12:39:58

标签: java design-patterns decorator

enter image description here

public class DecoratorPatternDemo {
 public static void main(String[] args) {

  Shape circle = new Circle();

  Shape redCircle = new RedShapeDecorator(new Circle());

  Shape redRectangle = new RedShapeDecorator(new Rectangle());
  System.out.println("Circle with normal border");
  circle.draw();

  System.out.println("\nCircle of red border");
  redCircle.draw();

  System.out.println("\nRectangle of red border");
  redRectangle.draw();
 }
}

任何人都可以告诉我使用引用类型RedShapeDecorator创建Shape实例的好处是什么? (我可以理解Shape circle = new Circle()的原因,因为这是多态性)。但不是RedShapeDecorator。如果我这样做那就是一样

  

RedShapeDecorator redCircle = new RedShapeDecorator(new Circle());

而不是

  

Shape redCircle = new RedShapeDecorator(new Circle());

谢谢。

1 个答案:

答案 0 :(得分:4)

RedShapeDecorator也是Shape,因为RedShapeDecoratorShapeDecorator,而Shape又是redCircle。在Shape方面使用redCircle对象的好处是,Shape circle = new Circle()实际上是装饰器的事实对代码的其他部分隐藏的方式与{{1}的方式非常相似隐藏circle实际上是Circle类型的事实,而不是Shape(您的多态示例)。

通常,装饰器不包括装饰器接口中也不包含的方法(通常,Shape的实例通过构造函数提供给装饰器,就像{{1}的情况一样因此,一旦装饰器被实例化,装饰器类型引用它通常没有任何好处,因此,装饰器实例通常使用接口类型而不是装饰器的类型声明。