授权模式的目的是什么?

时间:2011-08-23 23:24:59

标签: java android design-patterns delegation

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

我只是以此为例。我在委托编程上阅读了the Wikipedia article,但我仍然不确定其目的。为什么要使用'委托'?它如何帮助程序的控制流程?使用(或不使用)的缺点是什么?与听众一起使用是否最实用?

编辑:ListenerDelegate位于第487行,相关方法位于第1054行。

4 个答案:

答案 0 :(得分:56)

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

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

答案 1 :(得分:15)

根据有效的Java(Joshua Bloch),组合比继承更有利。组合比继承有几个优点。其中一个直觉如下:考虑一个从基类继承的子类。因此,基类的任何更改都会使子类变得脆弱,因为子类依赖于基类。通过使用继承,我们在子类上进行绑定以依赖基类,这使得我们的代码变得脆弱。但是,通过使用组合,我们可以消除此限制。通过建立“有关系”来完成组合。在课堂之间而不是'是-a'继承中的关系。 '代表模式'和装饰师模式'两者都是如何实现组合的例子。您可能希望阅读有关“组合与继承”的章节。在有效的java书中因为它非常有用。

有关简短说明,请参阅此文章:http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html

答案 2 :(得分:4)

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

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

答案 3 :(得分:0)

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