Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 绑定到同一接口的装饰器设计模式_Java_Design Patterns - Fatal编程技术网

Java 绑定到同一接口的装饰器设计模式

Java 绑定到同一接口的装饰器设计模式,java,design-patterns,Java,Design Patterns,我对装饰设计模式有一个小问题。装饰对象似乎与标准的非装饰对象绑定到同一接口 请参阅下面网站行的示例。 在本例中,RedShapedCorator绑定到shape接口,因此RedShapedCorator和标准圆对象只能调用draw()方法 那么,当我希望我的装饰对象能够调用more而不是draw()时,我该怎么办呢。如果我想让装饰过的对象具有drawBlackAndWhite()和draw3D()等方法,这两种方法都不适合在draw()方法中封装,该怎么办 换句话说,我希望能够扩展RedSha

我对装饰设计模式有一个小问题。装饰对象似乎与标准的非装饰对象绑定到同一接口

请参阅下面网站行的示例。

在本例中,RedShapedCorator绑定到shape接口,因此RedShapedCorator和标准圆对象只能调用draw()方法

那么,当我希望我的装饰对象能够调用more而不是draw()时,我该怎么办呢。如果我想让装饰过的对象具有drawBlackAndWhite()和draw3D()等方法,这两种方法都不适合在draw()方法中封装,该怎么办

换句话说,我希望能够扩展RedShapeDecorator以执行以下操作

redShapeDecorator.draw()
redShapeDecorator.drawBlackAndWhite();
redShapeDecorator.draw3D();

但是,由于面的形状限制,我只能调用RedShapedCorator.draw()。我如何解决这个问题

我不确定我的问题是否正确,但是如果您想要一个方法
drawBlackAndWhite()
(假设它类似于
RedShapeCorator.draw()
),您可以在装饰器中定义其他方法。要在decorator中获得
draw3D()
方法,您应该创建一个新的
Shape
接口实现,该接口能够绘制三维对象(因为现有的实现圆形和矩形是平面的)。如果您想在一个decorator实例中使用所有这些方法,请在其中放置多个
Shape
字段。但是您将无法通过引用type
Shape
调用方法
drawBlackAndWhite()
draw3D()
,因为Shape接口只有一个方法
draw()

或者您将这两个方法添加到
Shape
接口,或者它不再是装饰图案。您可能想要外观图案,不是装修工。当然,您也可以将方法添加到decorator中并将其实例化(不是作为接口,而是作为类),但再一次—它不再是decorator,而且据我所知,这是一种不好的做法。