java android design-patterns delegation

java - ¿Cuál es el propósito de un patrón de delegación?



android design-patterns (3)

El patrón de delegado se usa para que otra persona realmente haga el trabajo, por lo que, por ejemplo, en el ejemplo, SensorManager no sabrá cómo hacer lo que cada oyente quiere, pero solo quiere que un programa escuche el sensor.

Entonces, hay oyentes creados llamando a registerListener en el SensorManager , y estos oyentes pasan la información y luego pueden decidir qué hacer con los datos de los sensores.

Estaba buscando a través de la fuente en SensorManager en Android y encontré que cuando registra un SensorEventListener el SensorManager pasa el control del oyente a un ListenerDelegate .

Solo menciono esto como un ejemplo. Leí el artículo de Wikipedia sobre programación de delegados, pero todavía no estoy seguro de su propósito. ¿Por qué uno usaría un ''delegado''? ¿Cómo ayuda el flujo de control de un programa? ¿Cuáles son las desventajas de usar (o no) uno? ¿Es más práctico para usar con oyentes?

Editar: ListenerDelegate está en la línea 487 y los métodos en cuestión están alrededor de la línea 1054.


La delegación no es exactamente un ''patrón de diseño'' en el sentido utilizado en el libro de GoF. Es útil en una serie de escenarios y es una base para otros patrones

  • cuando desee realizar algunas acciones adicionales antes / después de delegar (ese es el patrón del Decorador, pero está basado en la delegación). Por ejemplo, Collections.synchronizedList(..) crea una nueva colección que delega en la original, pero tiene sus métodos sincronizados.
  • cuando tiene interfaces incompatibles y quiere adaptar una a la otra (el patrón del adaptador). Obtienes el objeto original y lo delegas de los métodos que se ajustan a la interfaz deseada. Por ejemplo, está la clase EnumerationIterator , que adapta las enumeraciones a la interfaz de Iterator . La clase tiene un método hasNext() que delega a enumeration.hasMoreElements()
  • Cuando desee ocultar cierta complejidad al usuario de su clase, puede tener métodos que deleguen en diferentes trabajadores reales. Por ejemplo, un Car puede tener start() , openWindow() y brake() , pero cada uno de estos métodos en realidad delegará en el motor, el.windows y el sistema de frenado ( ver también esto )

Según Java efectivo (por Joshua Bloch), la composición es favorable a la herencia. La composición tiene varias ventajas sobre la herencia. Una de las intuiciones para esto es la siguiente: Considere una subclase que hereda de una clase base. Entonces cualquier cambio en la clase base hará que la subclase sea frágil ya que la subclase depende de la clase base. Al usar la herencia, estamos haciendo un enlace en la subclase para depender de la clase base, lo que hace que nuestro código sea frágil. Sin embargo, al usar la composición, podemos eliminar esta limitación. La composición se realiza estableciendo una "relación has-a" entre las clases en lugar de la relación ''es-a'' como en la herencia. ''Patrón de delegado'' y ''Patrón de decorador'' son ejemplos de cómo se puede lograr la composición. Es posible que desee leer el capítulo sobre "composición vs herencia" en el libro eficaz de Java, ya que es bastante informativo.

Para una explicación más corta, puede consultar este artículo: http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-java-oops-design.html