授权模式的目的是什么?

aho*_*der 43 java android design-patterns delegation

我正在通过源码查看Android中的SensorManager,发现当你将一个监听器SensorEventListenerSensorManager传递控制注册到一个ListenerDelegate.

我只以此为例.我阅读关于委托编程的维基百科文章,但我仍然不确定其目的.为什么要使用'委托'?它如何帮助程序的控制流程?使用(或不使用)的缺点是什么?与听众一起使用最实用吗?

编辑:ListenerDelegate在第487行,所讨论的方法在第1054行附近.

Boz*_*zho 63

在GoF书中使用的意义上,授权并不是一种"设计模式".它在许多场景中都很有用,并且是其他模式的基础

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

  • 第三点(汽车示例)中定义的模式的名称是什么。 (2认同)
  • @EmptyData,它是Facade模式. (2认同)
  • 谈论委托,任何字段上的“@Delegate”[lombok注释](https://projectlombok.org/api/lombok/experimental/Delegate.html),使lombok生成将调用转发到该字段的委托方法 (2认同)

Roo*_*kie 18

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

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


Jam*_*ack 6

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

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