Design patterns 你能写GOF委派代码示例吗?

Design patterns 你能写GOF委派代码示例吗?,design-patterns,delegation,ooad,Design Patterns,Delegation,Ooad,我们正在研究GOF设计模式,并且在授权的前两段被阻止。我们无法同意所示段落中描述的代码是什么样子 我想最让人难以理解的是这段话: P>但继承时,继承的操作总是可以通过 C++中的< < /Cult>成员变量和SMALLATE中的自身来引用接收对象。为了实现与委托相同的效果,接收者将自己传递给委托者,让委托的操作引用接收者 (我的重点): 在委托中,对象通过委托给第二个对象(委托)来处理请求。委托是一个辅助对象,但具有原始上下文。在语言级别支持委托的情况下,通过使委托中的self引用原始(发送)

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

我想最让人难以理解的是这段话:

<> P>但继承时,继承的操作总是可以通过<代码> C++中的< < /Cult>成员变量和SMALLATE中的<代码>自身<代码>来引用接收对象。为了实现与委托相同的效果,接收者将自己传递给委托者,让委托的操作引用接收者

(我的重点):

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

无论它实际上是
self
还是
this
还是
current
还是
调用者
,都是特定于语言的。这意味着,在支持授权的语言中,以下内容将起作用:

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的结果,因为委托在窗口实例的上下文中执行区域,尽管代码是矩形的。也就是说,它通过
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()
时,我们将窗口实例传递给代理(通过
this
)。然后委托访问宽度和高度成员,通过显式传递的参数进行计算

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

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

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


就模式和代码外观而言,类图非常好地显示了它:两个类,Window和Rectangle

也许值得你拿一本真正的书(如果你还没有写在纸上的话)读一读前面描述图表的章节。或者可能我错了,它不在那本书中,但接下来会有另外一本OOAD/OOP书,解释这些图表是关于什么的,或者如何使用它们

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

另见:


如果我的答案没有完全回答您的问题,那么您可以解释一下,您在达成一致意见方面存在哪些问题,这将对我们有所帮助。比如你认为实现会是什么,你的朋友怎么想,这就是模式的要点:它们不描述代码。它们描述了可以用不同方式/语言实施的策略。如果您对实现有一个特定的问题,而不是询问代码,那就更好了。