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());
谢谢。
答案 0 :(得分:4)
RedShapeDecorator
也是Shape
,因为RedShapeDecorator
是ShapeDecorator
,而Shape
又是redCircle
。在Shape
方面使用redCircle
对象的好处是,Shape circle = new Circle()
实际上是装饰器的事实对代码的其他部分隐藏的方式与{{1}的方式非常相似隐藏circle
实际上是Circle
类型的事实,而不是Shape
(您的多态示例)。
通常,装饰器不包括装饰器接口中也不包含的方法(通常,Shape
的实例通过构造函数提供给装饰器,就像{{1}的情况一样因此,一旦装饰器被实例化,装饰器类型引用它通常没有任何好处,因此,装饰器实例通常使用接口类型而不是装饰器的类型声明。