委派模式的用途是什么?

2022-08-31 19:49:00

我正在查看Android中的SensorManager的源代码,发现当您注册一个将监听器的传递控制传递给.SensorEventListenerSensorManagerListenerDelegate

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

编辑:在第487行,有问题的方法在第1054行附近。ListenerDelegate


答案 1

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

  • 当您想在委派之前/之后执行一些其他操作时(这是装饰器模式,但它基于委派)。例如,创建一个新集合,该集合委托给原始集合,但其方法已同步。Collections.synchronizedList(..)
  • 当您具有不兼容的接口并且想要使一个接口适应另一个接口(适配器模式)时。您可以获取原始对象,并从符合所需接口的方法委托给它。例如,有一个类,它使枚举适应接口。该类具有委托给EnumerationIteratorIteratorhasNext()enumeration.hasMoreElements()
  • 当您想要对类的用户隐藏一些复杂性时,可以使用委托给不同实际工作线程的方法。例如,a 可以有 、 和 ,但这些方法中的每一个实际上都会委托给引擎、el.windows 和制动系统(另请参阅此Carstart()openWindow()brake())

答案 2

根据有效的Java(由Joshua Bloch撰写),组合优于遗传。与继承相比,组合有几个优点。其中一个直觉如下:考虑一个从基类继承的子类。因此,基类中的任何更改都会使子类变得脆弱,因为子类取决于基类。通过使用继承,我们正在对子类进行绑定以依赖于基类,这使得我们的代码变得脆弱。但是,通过使用组合,我们可以消除此限制。组合是通过在类之间建立“has-a关系”而不是像在继承中那样建立“is-a”关系来完成的。“代表模式”和“装饰者模式”都是如何实现构图的示例。你可能想阅读有效的java书中关于“组合与继承”的章节,因为它非常翔实。

有关更短的解释,您可以参考这篇文章:http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html


推荐