【发布时间】:2014-04-17 08:56:15
【问题描述】:
当一个类将任务“委托”给另一个类时:
“委托人”类是否必须将自己传递给“委托”类才能算作委托?还是简单的“责任转移”就足够了,没有一个类将自己作为参数传递?
【问题讨论】:
-
将自身传递给委托实际上并不是模式的一部分。如果发生这种情况,它只是代表如何工作的产物。
标签: oop delegation
当一个类将任务“委托”给另一个类时:
“委托人”类是否必须将自己传递给“委托”类才能算作委托?还是简单的“责任转移”就足够了,没有一个类将自己作为参数传递?
【问题讨论】:
标签: oop delegation
不,它不必将自己传递给委托人。事实上,委托有时会在大型类中用于抽象出特定功能而无需传递。
例如,如果我有一个bakery 类,并且我想做bakery.sellALoafOfBread(),从外面看,它可能看起来就像bakery 类处理了它。实际上,由面包店委派的cashier 班级完成了这项任务。它returned 一条面包的成本,bakery 类将这笔钱添加到每月利润中。
但是,如果委托确实绑定在大型类中,则大型对象可能希望传递指向自身的指针或引用。这样,小类就可以访问大类的变量和其他成员。
来自Wikipedia的示例:
class RealPrinter { // the "delegate"
void print() {
System.out.println("something");
}
}
class Printer { // the "delegator"
RealPrinter p = new RealPrinter(); // create the delegate
void print() {
p.print(); // delegation
}
}
public class Main {
// to the outside world it looks like Printer actually prints.
public static void main(String[] args) {
Printer printer = new Printer();
printer.print();
}
}
看,没有通过!
【讨论】:
当我们说一些 X 设计模式时,我们指的是 GoF 书中描述的模式。所以简而言之NO,就像上面解释的@blue-ice。
但是最初的术语OOP中的委托是指将它必须做的部分问题传递给另一个对象,而它不能。因此,最终完成任务的对象将需要对委托对象的引用,因为它需要访问该对象的某些部分。
这在MIT OOP delegation paper 中有更详尽的解释。但是如果你只想要论文摘要,可以看这篇文章The Gang Of Four Is Wrong And You Don't Understand Delegation。
文章的主要部分说:
Lieberman 在 GUI 绘图工具方面对此进行了讨论。以下是委托背后的关键思想:
当笔将绘图消息委托给原型笔时,它是在说“我不知道如何处理绘图消息。如果可以的话,我希望你能帮我回答,但如果你还有其他问题,比如我的 x 变量的值是多少,或者需要做任何事情,你应该回来问我。”如果消息被进一步委托,所有关于变量值的问题或回复消息的请求都将被推断到首先委托消息的对象。
简而言之,当您向对象发送消息时,它具有“自我”的概念,它可以在其中找到属性和其他方法。当该对象委托给另一个对象时,任何对“self”的引用总是指原始消息接收者。总是。
【讨论】: