Java 委托模式的目的是什么?

Java 委托模式的目的是什么?,java,android,design-patterns,delegation,Java,Android,Design Patterns,Delegation,我查看了Android中的源代码,发现当您注册SensorEventListener时,SensorManager将侦听器的控制权传递给ListenerDelegate 我只是举个例子。我读过委托编程,但我仍然不确定它的用途。为什么要使用“委托”?它如何帮助程序的控制流?使用(或不使用)的缺点是什么?它最适合与听众一起使用吗 编辑:ListenerDelegate位于第487行,所讨论的方法位于第1054行附近。委派并不完全是GoF书中使用的“设计模式”。它在许多场景中都很有用,并且是其他模式的

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

我只是举个例子。我读过委托编程,但我仍然不确定它的用途。为什么要使用“委托”?它如何帮助程序的控制流?使用(或不使用)的缺点是什么?它最适合与听众一起使用吗


编辑:
ListenerDelegate
位于第487行,所讨论的方法位于第1054行附近。

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

  • 当您希望在委派之前/之后执行一些附加操作时(这是装饰器模式,但它基于委派)。例如,
    Collections.synchronizedList(…)
    创建一个新集合,该集合委托给原始集合,但其方法已同步
  • 如果您有不兼容的接口,并且希望使一个接口适应另一个接口(适配器模式)。从符合所需接口的方法获取原始对象并委托给它。例如,有一个
    EnumerationIterator
    类,它使枚举适应
    Iterator
    接口。该类有一个
    hasNext()
    方法,该方法委托给
    枚举。hasMoreElements()
  • 当您想对类的用户隐藏一些复杂性时,您可以使用委托给不同实际工作者的方法。例如,
    汽车
    可以具有
    启动()
    打开车窗()
    制动()
    ,但这些方法中的每一种实际上都将委托给发动机、电动车窗和制动系统()

委托模式用于让其他人实际执行工作,因此,例如,在您的示例中,
SensorManager
不知道如何执行每个侦听器想要的操作,但您只需要一个程序侦听传感器

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

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


对于简短的解释,您可以参考本文:

在一句非常简单的话中,我可以说:委托的主要目的是保护您的对象不受对软件中其他对象的实现更改的影响。阅读更多内容

第三点(汽车示例)中定义的模式名称。@EmptyData,这是外观模式。谈到委托,
@delegate
在任何字段上,让lombok生成将调用转发到字段的委托方法,以减少类的责任。