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
Les rôles
- La méthode squelette,
expedier() - Elle appartient à la classe mère
Envoiet 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.
EnvoiCoursierla 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.