Design patterns 在Decorator模式中使用其他方法

Design patterns 在Decorator模式中使用其他方法,design-patterns,language-agnostic,decorator,Design Patterns,Language Agnostic,Decorator,在GoF Design Patterns一书中关于Decorator模式的章节中,有一个GUI控件示例。下面是C++中的一个示例代码(我已经稍稍改动了): decorator类的要点是添加新的行为/外观等。。。指向一个对象。例如: VisualComponent myControl = new BorderDecorator(new ScrollDecorator(new TextView))); 创建可滚动且具有边框的文本视图控件。添加边框对客户端不可见-它是一个私有方法([2]),在Vis

在GoF Design Patterns一书中关于Decorator模式的章节中,有一个GUI控件示例。下面是C++中的一个示例代码(我已经稍稍改动了):

decorator类的要点是添加新的行为/外观等。。。指向一个对象。例如:

VisualComponent myControl = new BorderDecorator(new ScrollDecorator(new TextView)));
创建可滚动且具有边框的文本视图控件。添加边框对客户端不可见-它是一个私有方法(
[2]
),在
VisualComponent
界面的
Draw()
方法中调用

然而,在本例中,作者还介绍了(在图中)滚动GUI控件的方法(
[1]
)。现在,书中没有提到更多的内容,所以我不知道这个方法到底应该做什么,或者它应该如何工作。最重要的是,我不知道它是公共的(也是类接口的一部分)还是私有的

假设是后一种情况,它将如何工作?
VisualComponent
界面定义的唯一方法是
Draw()
Resize()
,它们都不适用于滚动控件的任务(通常由用户单击并拖动鼠标)。我已经用
[3]
标记了可能的调用,但我不确定它们是否正确

假设是前一种情况,该方法使用新的公共方法扩展类的接口,这就是我问题的要点。客户端应该如何调用该方法?如果它不是顶级装饰器(如我们的示例中所示),它就不能访问
组件
字段,因为它是私有的


因此,总而言之,decorator类可以添加新的public方法吗?如果是这样,这些应该如何命名?如果没有(在这种情况下,他们只能添加新的私有方法),这些方法是否应该仅以符合组件接口中定义的行为的方式扩展对象的行为(在我们的例子中是
VisualComponent
)?例如,如果组件接口只定义了一个
Draw()
方法,那么这些新的私有方法是否应该只处理绘图/外观?

尽管没有任何东西阻止您通过装饰器添加新的公共方法,但它可能不是最佳解决方案。您已经正确地注意到,除非对象被装饰器类型的变量引用,否则客户端将无法调用该方法

在中,建议您在这种情况下使用继承或适配器模式。这听起来是避免上述缺点的合理解决方案

VisualComponent myControl = new BorderDecorator(new ScrollDecorator(new TextView)));