En génie logiciel , le modèle de délégation est un modèle de conception orienté objet qui permet la composition d'objets pour obtenir la même réutilisation de code que l'héritage .
Dans la délégation, un objet gère une requête en déléguant à un second objet (le délégué ). Le délégué est un objet d'assistance , mais avec le contexte d'origine . Avec la prise en charge de la délégation au niveau du langage, cela se fait implicitement en faisant selfréférence dans le délégué à l'objet d'origine (expéditeur), et non au délégué (objet récepteur). Dans le modèle délégué, cela se fait plutôt en passant explicitement l'objet d'origine au délégué, en tant qu'argument d'une méthode. Le terme « délégation » est souvent utilisé de manière vague pour désigner le concept distinct de transfert , où l'objet expéditeur utilise simplement le membre correspondant sur l'objet récepteur, évalué dans le contexte de l' objet récepteur , et non de l'objet d'origine.
Cet article utilise « objet d'envoi/objet de réception » pour les deux objets, plutôt que « objet de réception/délégué », en soulignant quels objets envoient et reçoivent l'appel de délégation, et non l'appel d'origine.
Définition
Dans l'introduction de Gamma et al. 1994, la délégation est définie comme :
La délégation est un moyen de rendre la composition aussi puissante pour la réutilisation que l'héritage [Lie86, JZ91]. Dans la délégation, deux objets sont impliqués dans la gestion d'une requête : un objet récepteur délègue des opérations à son délégué . Cela est analogue aux sous-classes qui reportent les requêtes aux classes parentes. Mais avec l'héritage, une opération héritée peut toujours faire référence à l'objet récepteur via la
thisvariable membre en C++ etselfen Smalltalk. Pour obtenir le même effet avec la délégation, le récepteur se transmet au délégué pour permettre à l'opération déléguée de faire référence au récepteur.
Exemple
Dans l'exemple ci-dessous (utilisant le langage de programmation Kotlin ), la classe Window délègue l' area()appel à son objet Rectangle interne (son délégué).
classe Rectangle ( val largeur : Int , val hauteur : Int ) { zone amusante () = largeur * hauteur } classe Window ( val bounds : Rectangle ) { // Délégation fun area () = bounds . area () }
Prise en charge linguistique
Certains langages disposent d'un support intégré spécial pour la délégation. Par exemple, dans le langage de programmation Kotlin,by le mot-clé délègue à l'interface d'un autre objet :
interface ClosedShape { zone de divertissement (): Int } classe Rectangle ( val largeur : Int , val hauteur : Int ) : ClosedShape { override fun area () = largeur * hauteur } // L'implémentation ClosedShape de Window délègue à celle du Rectangle qui est la classe de limites Window ( private val bounds : Rectangle ) : ClosedShape par bounds