web-dev-qa-db-fra.com

À quoi sert un modèle de délégation?

Je regardais la source pour SensorManager dans Android et j'ai découvert que lorsque vous enregistrez un SensorEventListener le SensorManager passe le contrôle du écouteur d'un ListenerDelegate.

Je soulève seulement cela à titre d'exemple. J'ai lu l'article Wikipedia sur la programmation des délégués mais je ne suis toujours pas sûr de son objectif. Pourquoi utiliserait-on un "délégué"? Comment cela aide-t-il à contrôler le flux d'un programme? Quels sont les inconvénients d'en utiliser (ou pas) un? Est-il plus pratique pour une utilisation avec des auditeurs?

Edit: ListenerDelegate est sur la ligne 487 et les méthodes en question sont autour de la ligne 1054.

43
ahodder

La délégation n'est pas exactement un "modèle de conception" au sens utilisé dans le livre du GoF. Il est utile dans un certain nombre de scénarios et sert de base à d'autres modèles

  • lorsque vous souhaitez effectuer des actions supplémentaires avant/après la délégation (c'est le modèle Decorator, mais il est basé sur la délégation). Par exemple, Collections.synchronizedList(..) crée une nouvelle collection qui délègue à celle d'origine, mais ses méthodes sont synchronisées.
  • lorsque vous avez des interfaces incompatibles et que vous souhaitez adapter l'une à l'autre (le modèle d'adaptateur). Vous obtenez l'objet d'origine et vous le déléguez à partir de méthodes conformes à l'interface souhaitée. Par exemple, il y a la classe EnumerationIterator, qui adapte les énumérations à l'interface Iterator. La classe a une méthode hasNext() qui délègue à enumeration.hasMoreElements()
  • lorsque vous souhaitez masquer une certaine complexité à l'utilisateur de votre classe, vous pouvez avoir des méthodes qui délèguent à différents travailleurs réels. Par exemple, un Car peut avoir start(), openWindow() et brake(), mais chacune de ces méthodes déléguera en fait au moteur, el. fenêtres et système de freinage ( voir aussi ceci )
61
Bozho

Selon efficace Java (par Joshua Bloch), la composition est favorable par rapport à l'héritage. La composition a plusieurs avantages par rapport à l'héritage. L'une des intuitions pour cela est la suivante: Considérons une sous-classe qui hérite de une classe de base. Ainsi, tout changement dans la classe de base rendra la sous-classe fragile car la sous-classe dépend de la classe de base. En utilisant l'héritage, nous établissons une liaison sur la sous-classe pour qu'elle dépende de la classe de base, ce qui rend notre code fragile. Cependant, en utilisant la composition, nous pouvons supprimer cette limitation. La composition se fait en établissant une "relation has-a" entre les classes au lieu de la relation "is-a" comme dans l'héritage. "Modèle de délégué" et "Décorateur "les deux sont des exemples de la façon dont la composition peut être réalisée. Vous voudrez peut-être lire le chapitre" composition vs héritage "dans le livre efficace Java car il est assez informatif.

Pour une explication plus courte, vous pouvez vous référer à cet article: http://javarevisited.blogspot.com/2013/06/why-favor-composition-over-inheritance-Java-oops-design.html

17
Rookie

Le modèle délégué est utilisé pour demander à quelqu'un d'autre de faire le travail, donc, par exemple, dans votre exemple, le SensorManager ne va pas savoir comment faire ce que chaque auditeur veut, mais vous ne voulez qu'un seul programme écoutant au capteur.

Il y a donc des écouteurs créés en appelant registerListener sur le SensorManager, et ces écouteurs reçoivent les informations et peuvent ensuite décider quoi faire avec les données des capteurs.

6
James Black