我正在浏览Android中的SensorManager源代码,发现当您注册SensorEventListener
时,SensorManager
将对侦听器的控制权传递给ListenerDelegate
。
我只是以此为例。我在委托编程上阅读了the Wikipedia article,但我仍然不确定其目的。为什么要使用'委托'?它如何帮助程序的控制流程?使用(或不使用)的缺点是什么?与听众一起使用是否最实用?
编辑:ListenerDelegate
位于第487行,相关方法位于第1054行。
答案 0 :(得分:56)
在GoF书中使用的意义上,代表团并不完全是一种“设计模式”。它在许多场景中都很有用,并且是其他模式的基础
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