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

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

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

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

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

  • Cuando desea realizar algunas acciones adicionales antes / después de delegar (que es el patrón Decorator, pero se basa en la delegación). Por ejemplo, Collections.synchronizedList(..) crea una nueva colección que delega a la original, pero tiene sus métodos sincronizados.
  • Cuando tiene interfaces incompatibles y desea adaptar una a la otra (el patrón del adaptador). Obtiene el objeto original y delega a él desde métodos que se ajustan a la interfaz deseada. Por ejemplo, hay la clase EnumerationIterator , que adapta las enumeraciones a la interfaz Iterator . La clase tiene un método hasNext() que delega a enumeration.hasMoreElements()
  • Cuando desea ocultar algo de complejidad del usuario de su clase, puede tener métodos que delegan a diferentes trabajadores reales. Por ejemplo, un Car puede tener start() , openWindow() y brake() , pero cada uno de estos métodos delegará en el motor, el.windows y el sistema de frenado ( véase también este )

Según Java eficaz (por Joshua Blosch), la composición es favorable sobre 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. Así que cualquier cambio en la clase base hará que la subclase sea frágil ya que la subclase depende de la clase base. Por lo que mediante el uso de la herencia, estamos haciendo un enlace a la subclase para depender de la clase base, lo que hace que nuestro código frágil. Mediante el uso de la composición, podemos eliminar esta limitación. La composición se realiza estableciendo una relación entre las clases en lugar de la relación is-a como en la herencia. 'Patrón delegado' y 'Patrón 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 java eficaz, ya que es muy informativo.

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

El patrón delegado se utiliza para que alguien más realice el trabajo, por ejemplo, en su ejemplo, el SensorManager no va a saber cómo hacer lo que cada oyente quiere, pero sólo quiere un programa que escuche el sensor.

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

  • La ejecución de instrumentación falló debido a 'java.io.FileNotFoundException'
  • ¿Cómo generar automáticamente diff entre versiones de API?
  • No se puede enlazar una acción. LibGDX
  • Tiempo de espera en DefaultHttpClient
  • Importar archivo .jar externo al proyecto Android
  • android.net.SntpClient falta en Android SDK
  • El inicio de Backend para móviles subscribeToCloudMessage no funcionará
  • Cómo rellenar Android ListView con información de la consulta de Firebase
  • Pestañas en la parte superior e inferior de la pantalla
  • Procesamiento de anotaciones multi-módulo en Android Studio
  • Error al resolver: Error: (23, 17) junit: junit: 4.12 en android studio 1.4
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.