【问题标题】:Can you write GOF Delegation code examples?你能写 GOF 委托代码示例吗?
【发布时间】:2018-05-21 08:39:51
【问题描述】:

我们正在研究 GOF 设计模式,但在委托的前两段中受阻。我们无法同意所示段落中描述的代码是什么样的。

【问题讨论】:

  • 如果我的回答还没有回答你的问题,如果你能解释一下你们在哪些方面存在分歧,这对我们很有帮助。比如认为实现会是什么,你的朋友怎么想。
  • 这是关于模式的重点:它们不描述代码。它们描述了您可以以不同方式/语言实施的策略。如果您有关于您的实现的具体问题而不是询问代码,那会更好。

标签: design-patterns delegation ooad


【解决方案1】:

我想让这句话难以理解的主要原因是这段话:

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

Quoting Wikipedia(强调我的):

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

实际上是 self 还是 thiscurrentcaller 是特定于语言的。这意味着在支持委派的语言中,以下内容将起作用:

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 实例并访问它的成员。根据您使用的语言,您的里程可能会有所不同。

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

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

【讨论】:

    【解决方案2】:

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

    也许值得你买一本真正的书(如果你还没有纸质版的话)并阅读描述图表的早期章节之一。或者也许我错了,它不在那本书中,然后再获得另一本 OOAD/OOP 书,解释这些图的含义或如何使用它们。

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

    参见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 2011-05-30
      相关资源
      最近更新 更多