Aide-mémoire, Head First Design Patterns, chapitre 8

Template Method

Une classe mère fixe l'ordre des étapes d'un traitement. Les sous-classes remplissent certaines étapes sans toucher à cet ordre. Vous le croiserez surtout dans les frameworks, qui appellent vos méthodes au bon moment.

« Définir le squelette d'un algorithme dans une opération, en laissant certaines étapes aux sous-classes. Template Method permet aux sous-classes de redéfinir certaines étapes d'un algorithme sans changer sa structure. » Gamma, Helm, Johnson et Vlissides, Design Patterns, 1994

Template Method appliqué à l'envoi d'un colis La classe abstraite Envoi possède la méthode expedier, qui appelle preparer, emballer puis remettre. EnvoiRelais et EnvoiCoursier héritent d'Envoi. EnvoiRelais écrit remettre. EnvoiCoursier écrit emballer et remettre. La classe mère appelle les méthodes des sous-classes. «abstract» Envoi expedier() → preparer() → emballer() → remettre() crochet à remplir Le squelette.L'ordre desétapes est fixé. appelle EnvoiRelais remettre() EnvoiCoursier emballer(), remettre() Les sous-classes remplissentles étapes sans changer l'ordre. « Ne nous appelez pas,nous vous appellerons. »

Les rôles

La méthode squelette, expedier()
Elle appartient à la classe mère Envoi et appelle les étapes dans un ordre fixé : préparer, emballer, remettre.
Les étapes à remplir, remettre()
Une méthode abstraite. Chaque sous-classe doit l'écrire.
Les crochets, emballer()
Une étape facultative avec un comportement par défaut, ici un carton simple. EnvoiCoursier la redéfinit pour un emballage isotherme. On parle aussi de hook.

Le reconnaître dans les frameworks

Le framework fixe le déroulement, et vous écrivez des méthodes aux noms imposés qu'il appelle au bon moment. La classe de base d'un composant Lit appelle render() depuis sa propre méthode update(), ce qui correspond au pattern exact. Angular appelle ngOnInit une fois que le composant a reçu ses entrées.

Le cas des éléments personnalisés

Le navigateur appelle connectedCallback quand un élément entre dans la page et disconnectedCallback quand il en sort, comme pour CarteAtelier dans le cours. L'ordre de ces appels appartient au navigateur, et non à une méthode de HTMLElement. Le cours y voit donc une inversion de contrôle comparable plutôt que le pattern exact.

Le principe du chapitre

« Ne nous appelez pas, nous vous appellerons. » Le livre l'appelle le principe d'Hollywood. La classe mère appelle le code des sous-classes au moment qu'elle choisit, et les sous-classes attendent qu'on les appelle.

En TypeScript

Dans votre propre code, une fonction reçue en paramètre remplace souvent la sous-classe, par exemple expedier(commande, remettre). On retrouve alors Strategy, et la composition évite une hiérarchie de classes.

À vous

Dans un composant Lit, quel code appelle render(), et à quel moment ?

Voir la réponse

Lit l'appelle lui-même. La classe de base exécute render() pendant chaque mise à jour, déclenchée par le changement d'une propriété réactive. Votre classe remplit seulement cette étape du squelette.