【问题标题】: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)
【解决方案3】:
委托模式用于让其他人实际完成工作,因此,例如,在您的示例中,SensorManager 不会知道如何做每个听众想要做的事情,但您只需要一个程序收听到传感器。
因此,通过在SensorManager 上调用registerListener 创建了侦听器,这些侦听器被传递信息,然后可以决定如何处理来自传感器的数据。
【解决方案4】:
我可以用一个非常简单的句子说:委托的主要目的是保护您的对象免受软件中其他对象的实现更改。阅读更多here