你能写GOF代表团代码示例吗?

时间:2017-12-07 09:28:05

标签: design-patterns delegation ooad

我们正在研究GOF设计模式,并在前两段授权中被阻止。我们无法同意所显示段落中描述的代码是什么样的。 Delegation from GOF

2 个答案:

答案 0 :(得分:1)

我认为让这个难以理解的主要原因是这段话:

  

但是对于继承,继承的操作总是可以通过C ++中的this成员变量和Smalltalk中的self来引用接收对象。为了通过委托获得相同的效果,接收器将自己传递给委托,让委托操作引用接收者。

Quoting Wikipedia(强调我的):

  

在委托中,对象通过委托给第二个对象(委托)来处理请求。委托是辅助对象, 但具有原始上下文 。通过对委派的语言级支持,这通过委托中的self引用原始(发送)对象而不是委托(接收对象)来隐式完成。

实际上selfthiscurrentcaller是否特定于语言。这意味着在支持委派的语言中,以下方法可行:

Window
  int width: 640 
  int height: 480
  Rectangle rectangle: new Rectangle()
  int Area(): rectangle.Area()

Rectangle
  int Area(): self.width * self.height

Window window: new Window()
print window.Area()

这将打印640x480的结果,因为委托在Window实例的上下文中执行Area,尽管代码在Rectangle中。也就是说,它使用从窗口到self的宽度和高度。

在不支持此自动上下文传递的语言中,您需要将调用方传递给代理:

Window
  int width: 640 
  int height: 480
  Rectangle rectangle: new Rectangle()
  int Area(): rectangle.Area(this)

Rectangle
  int Area(context): context.width * context.height

Window window: new Window()
print window.Area()

调用Area()时,我们将Window实例传递给委托(通过this)。然后委托访问宽度和高度成员,通过显式传递的参数进行计算。

请注意,上面的伪语言不会对类型或可见性等内容做出任何假设,我们假设我们可以简单地传递这样的Windows实例并访问它的成员。根据您的语言使用情况,您的里程可能会有所不同。

因此,授权实际上是关于绑定上下文而不仅仅是转发方法调用。最后一次引用维基百科页面:

  

请注意,“委托”通常用于指代转发的不同概念,其中发送对象仅使用接收对象上的相应成员,在接收对象的上下文中进行评估,而不是原始对象。 / p>

答案 1 :(得分:0)

就模式而言以及代码的外观,类图很好地展示了它:两个类,Window和Rectangle。

或许值得你拿到实际的书(如果你还没有用纸),并阅读前面描述图表的章节之一。或者也许我错了,并且它不在那本书中,而是获得了另外一本OOAD / OOP书籍,解释这些图表的内容或如何使用它们。

如果到目前为止这看起来很愚蠢:如果它值得,而且我认为这也是由GoF创造的,那么这将有利于聚合而不是继承"这本身就值得引起共鸣。如果你们所有人都没有,我们还没有,为什么不这样做呢?以不同的编写代码/概念来讨论一些具体的例子。

参见: