【问题标题】:What is the purpose of a delegation pattern?委托模式的目的是什么?
【发布时间】:2011-08-23 23:24:58
【问题描述】:

我在 Android 中查看 SensorManager 的源代码,发现当您注册 SensorEventListener 时,SensorManager 会将侦听器的控制权传递给 ListenerDelegate

我只是举个例子。我在委托编程中阅读了the Wikipedia article,但我仍然不确定它的目的。为什么要使用“代表”?它如何帮助程序的控制流?使用(或不使用)一个有什么缺点?与听众一起使用是否最实用?

编辑:ListenerDelegate 在第 487 行,有问题的方法在第 1054 行附近。

【问题讨论】:

  • 减少一个类的责任。

标签: java android design-patterns delegation


【解决方案1】:

委托并不完全是 GoF 书中使用的意义上的“设计模式”。它在许多场景中都很有用,并且是其他模式的基础

  • 当您想在委托之前/之后执行一些额外的操作时(这是装饰器模式,但它基于委托)。例如,Collections.synchronizedList(..) 创建了一个新集合,该集合委托给原始集合,但其方法已同步。
  • 当您有不兼容的接口并且您希望将一个接口适配到另一个接口时(适配器模式)。您获取原始对象并从符合所需接口的方法委托给它。例如,有一个 EnumerationIterator 类,它使枚举适应 Iterator 接口。该类有一个hasNext() 方法,它委托给enumeration.hasMoreElements()
  • 当您想对类的用户隐藏一些复杂性时,您可以使用委托给不同实际工作人员的方法。例如,Car 可以有 start()openWindow()brake(),但这些方法中的每一个实际上都将委托给引擎、el.windows 和制动系统 (see also this)

【讨论】:

  • 第三点中定义的模式的名称是什么(汽车示例)。
  • @EmptyData,这是 Facade 模式。
  • 谈到委托,@Delegatelombok annotation 在任何字段上,让 lombok 生成将调用转发到字段的委托方法
【解决方案2】:

根据有效的 Java(作者 Joshua Bloch),组合优于继承。组合比继承有几个优点。对此的直觉之一如下:考虑从基类继承的子类。因此,基类的任何更改都会使子类变得脆弱,因为子类依赖于基类。通过使用继承,我们将子类绑定为依赖于基类,这使我们的代码变得脆弱。然而,通过使用组合,我们可以消除这个限制。组合是通过在类之间建立“有关系”而不是继承中的“是”关系来完成的。 “委托模式”和“装饰者模式”都是如何实现组合的示例。您可能想阅读有效的 Java 书籍中关于“组合与继承”的章节,因为它提供了很多信息。

更短的解释可以参考这篇文章:http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html

【讨论】:

    【解决方案3】:

    委托模式用于让其他人实际完成工作,因此,例如,在您的示例中,SensorManager 不会知道如何做每个听众想要做的事情,但您只需要一个程序收听到传感器。

    因此,通过在SensorManager 上调用registerListener 创建了侦听器,这些侦听器被传递信息,然后可以决定如何处理来自传感器的数据。

    【讨论】:

      【解决方案4】:

      我可以用一个非常简单的句子说:委托的主要目的是保护您的对象免受软件中其他对象的实现更改。阅读更多here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-13
        • 2012-03-23
        • 2013-12-30
        • 2014-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多