【问题标题】:Design pattern with decorator带装饰器的设计模式
【发布时间】:2018-04-01 12:39:58
【问题描述】:

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();
 }
}

谁能告诉我创建一个引用类型为ShapeRedShapeDecorator 实例有什么好处? (我可以理解Shape circle = new Circle() 的原因,因为这是多态性)。但不是RedShapeDecorator。如果我这样做是一样的吗

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

而不是

形状 redCircle = new RedShapeDecorator(new Circle()); .

谢谢。

【问题讨论】:

  • 如果你只需要一个Shape,因为你只调用draw()方法,那么使用RedShapeDecorator redCircle将是太多的实现细节。
  • i can understand the reason with Shape circle = new Circle() because this is polymorphismRedShapeDecorator 也是多态性。这取决于您要公开多少细节,或者说要根据所使用的接口退出合同,或者只是直接想使用具体类来使用某些实用程序......
  • 是的,我知道它是多态性。但我的意思是我可以理解使用多态与圆形的原因..但为什么使用多态与 redDecortor :) ..任何原因?
  • 你的显示器右下角应该有或曾经有一只鸭子,向它解释使用多态与圆的原因,看看是否同样的原因适用于装饰器。

标签: java design-patterns decorator


【解决方案1】:

RedShapeDecorator 也是可传递的Shape,因为RedShapeDecoratorShapeDecorator,而Shape 又是Shape。就Shape 而言,使用redCircle 对象的好处是redCircle 实际上是一个装饰器这一事实对代码的其他部分隐藏,就像Shape circle = new Circle() 隐藏了@987654330 的事实一样@ 实际上是 Circle 类型,而不是 Shape(您的多态示例)。

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

【讨论】:

    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多