Describe the Strategy pattern

This commit is contained in:
Fred Pauchet 2024-03-25 21:34:22 +01:00
parent 86d6cb0cc0
commit 3aac90b9a7
4 changed files with 75 additions and 1 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@ -0,0 +1,74 @@
---
title: Head First Design Patterns
writers: [Eric Freeman, Elisabeth Robson]
---
La structure-même du livre est assez inhabituelle, et force le travail, la répétition et la compréhension (ce qui est plutôt bien).
Ceci dit, cette même structure va parfois trop loin dans la dérision et dans une présentation un peu surfaite des personnages.
J'aimais assez bien la découpe et la chronologie, ainsi que les exemples donnés, mais le fait qu'il soit un peu fouilli me dérangeait un peu.
Tous les patrons de conception (= _design patterns_, mais rassurez-vous, j'utiliserai uniquement ce terme par la suite) ne sont pas représentés, mais on y trouve les principaux - dont certains que vous utilisez sans doute déjà sans savoir qu'ils portent un petit nom bien à eux.
En plus de représenter des solutions reconnues à des problèmes connus, les _design patterns_ correspondent aussi à un vocabulaire commun.
Ces _design patterns_ peuvent être regroupés selon plusieurs catégories :
* [Creational](https://refactoring.guru/design-patterns/creational-patterns), orientés sur le découplage et l'instanciation de composants,
* [Behavioral](https://refactoring.guru/design-patterns/behavioral-patterns) pour aider aux interactions entre composants,
* [Structural](https://refactoring.guru/design-patterns/structural-patterns), pour les structures plus larges.
Pour rappel, la Programmation Orientée Objets se base sur les principes suivants :
1. Encapsuler ce qui varie,
2. Favoriser la composition sur l'héritage,
3. Programmer envers des interfaces, pas des classes concrètes.
## Creational
### Factory & Abstract Factory
### Singleton
## Behavioral
### Command
### Iterator
### Template
### State
### Observer
### Strategy
> Plutôt que d'implémenter une forme d'héritage dès qu'on en a l'occasion, l'idée est de différencier l'élément de son comportement.
L'exemple abordé est sans doute le plus "drôle", puisque l'auteur propose de représenter certaines classes de canard (héritant tous d'une même classe `Duck`), jusqu'à arriver à modéliser un canard en plastique, qui ne pourra donc pas voler.
On en arrive à comprendre la nécessité de dissocier l'implémentation du comportement par l'absurde[^1].
On en arrive ainsi à représenter une classe dont le comportement (`FlyingBehaviour` et `QuackBehaviour` sont totalement déléguées à d'autres classes).
Les avantages sont nombreux, puisque cette modélisation respecte le _Single Responsibility Principle_ tout en permettant une réutilisabilité très élevée.
De cette manière, il suffit de déclarer une nouvelle classe, puis de lui injecter le comportement que nous attendons d'elle.
Une autre conclusion est qu'il est parfois mieux d'implémenter un `has-a` (= composition, délégation, ...) qu'un `is-a` (= héritage).
De la même manière, nous pouvons implémenter des personnes d'un jeu de rôles et "réutiliser" leurs armes en définissant un `WeaponBehaviour` :
![](strategy.drawio.png)
[^1]: en mode, "_Si vous faites de l'héritage sans réfléchir, vous allez vous planter_".
## Structural
### Composite
### Decorator
### Adapter
### Façade
### Proxy
### Compound

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -1,5 +1,5 @@
+++
title = "Lectures informati{ves|ques}"
title = "Lectures informatiques"
sort_by = "date"
transparent = true
+++