Quel est le but d'un modèle de délégation?

je regardais à travers la source de SensorManager dans Android et a constaté que lorsque vous enregistrez un SensorEventListener le SensorManager passe le contrôle de l'auditeur à un ListenerDelegate .

Je ne le cite qu'à titre d'exemple. J'ai lu l'article de Wikipedia sur la programmation des délégués mais je ne suis toujours pas sûr de son but. Pourquoi utiliser un "délégué"? Comment peut-il aider le flux de contrôle d'un programme? Quelles sont les inconvénients d'en utiliser (ou non) un? Est-il le plus pratique à utiliser avec les auditeurs?

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

39
demandé sur Simon Morgan 2011-08-24 03:24:58

3 réponses

délégation N'est pas exactement un "modèle de conception" dans le sens utilisé dans le livre GoF. Il est utile dans un certain nombre de scénarios, et est une base pour d'autres motifs

  • quand vous voulez effectuer quelques actions supplémentaires avant/après que vous déléguez (c'est le modèle de décorateur, mais il est basé sur la délégation). Par exemple, Collections.synchronizedList(..) crée une nouvelle collection qui délègue à l'original, mais a ses méthodes synchronisées.
  • lorsque vous avez incompatible interfaces et vous souhaitez adapter l'un à l'autre (l'adaptateur). Vous obtenez l'objet original et lui déléguez à partir de méthodes qui se conforment à l'interface désiré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é de l'utilisateur de votre classe, vous pouvez avoir des méthodes qui délégué à différentes travailleurs. Par exemple, un Car peut avoir start() , openWindow() et brake() , mais chacune de ces méthodes sera en fait déléguée au moteur, el.fenêtres et système de freinage ( Voir Aussi ce )
52
répondu Bozho 2017-05-23 12:10:41

selon Java efficace (par Joshua Bloch), la composition est favorable sur l'héritage. La Composition présente plusieurs avantages par rapport à l'héritage. Une des intuitions pour cela est la suivante: considérez une sous-classe qui hérite d'une classe de base. Donc 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 faisons une liaison sur la sous-classe pour dépendre de la classe de base, ce qui rend notre code fragile. Cependant, en utilisant composition, nous pouvons supprimer cette limitation. La Composition se fait en établissant une relation "has-a" entre les classes au lieu d'une relation "is-a" comme dans l'héritage. Les modèles "Delegate" et "Decorator" sont tous deux des exemples de la façon dont la composition peut être réalisée. Vous pourriez vouloir lire le chapitre sur 'composition vs héritage' dans le livre Java efficace car il est très instructif.

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

12
répondu Rookie 2017-11-06 14:33:59

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

ainsi, il y a des auditeurs créés en appelant registerListener sur le SensorManager , et ces auditeurs sont passés l'information et peuvent ensuite décider ce qu'il faut faire avec les données des capteurs.

3
répondu James Black 2011-08-23 23:30:29