Modèle de délégation - Delegation pattern

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 d'obtenir la même réutilisation de code que l' héritage .

En délégation, un objet gère une requête en déléguant à un deuxième objet (le délégué ). Le délégué est un objet assistant , mais avec le contexte d'origine . Avec la prise en charge au niveau du langage de la délégation, cela se fait implicitement en ayant selfdans le délégué une référence à l'objet d'origine (envoi) et non au délégué (objet récepteur). Dans le modèle de délégué, cela est plutôt accompli en passant explicitement l'objet d'origine au délégué, en tant qu'argument d'une méthode. Notez que « délégation » est souvent utilisé de manière lâche pour désigner le concept distinct de transfert , où l'objet expéditeur utilise simplement le membre correspondant sur l'objet destinataire, évalué dans le contexte de l' objet destinataire , et non de l'objet d'origine.

Notez que cet article utilise « objet d'envoi/objet de réception » pour les deux objets, plutôt que « objet de réception/délégué », soulignant quels objets envoient et reçoivent l'appel de délégation, pas l'appel d'origine.

Définition

Dans l'introduction à Gamma et al. 1994, Grady Booch définit la délégation 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 le traitement d'une requête : un objet récepteur délègue des opérations à son délégué . Ceci est analogue aux sous-classes qui reportent les demandes 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++ et selfen Smalltalk. Pour obtenir le même effet avec la délégation, le récepteur se transmet au délégué pour que l'opération déléguée se réfère 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é).

class Rectangle(val width: Int, val height: Int) {
    fun area() = width * height
}

class Window(val bounds: Rectangle) {
    // Delegation
    fun area() = bounds.area()
}

Support linguistique

Certains langages ont un support spécial pour la délégation intégré. Par exemple, dans le langage de programmation Kotlin , nous pourrions écrire :

interface ClosedShape {
    fun area(): Int
}

class Rectangle(val width: Int, val height: Int) : ClosedShape {
    override fun area() = width * height
}

class Window(private val bounds: ClosedShape) : ClosedShape by bounds

Voir également

Les références

Liens externes