Bridge Pattern vs Strategy Pattern
1. Bridge Pattern
- Découpler une abstraction de son implémentation : Permet de séparer une abstraction (par exemple, une notification) de son implémentation concrète (email, SMS, push), de sorte que les deux puissent évoluer indépendamment.
- Réduction du couplage : Facilite l'extension des deux parties sans modifier l'autre.
- Exemple : Systèmes de notification où le type de notification (abstraction) est séparé de la méthode d'envoi (implémentation comme email, SMS, etc.).
2. Strategy Pattern
- Choix dynamique d'un algorithme : Permet de choisir dynamiquement une stratégie ou un algorithme à appliquer pour une tâche spécifique, en fonction des besoins au moment de l'exécution.
- Séparation des algorithmes : Chaque algorithme est encapsulé dans une classe distincte pour une meilleure flexibilité.
- Exemple : Gestion des méthodes de paiement (PayPal, Stripe, virement) où la stratégie de paiement est choisie en fonction des préférences de l'utilisateur.
Comparaison directe :
| Caractéristique | Bridge Pattern | Strategy Pattern |
|---|---|---|
| Objectif principal | Découpler abstraction et implémentation | Choisir dynamiquement un algorithme |
| Changement dynamique | Oui, changement possible de l'implémentation | Oui, algorithme choisi à la volée |
| Complexité cachée | Oui, cache l'implémentation derrière une abstraction | Non, expose les stratégies mais simplifie leur gestion |
| Flexibilité dans l'ajout de fonctionnalités | Très flexible, permet d'ajouter facilement des implémentations | Moyenne, limité aux algorithmes implémentés |
| Exemple d'application | Systèmes de notification avec plusieurs canaux | Méthodes de paiement dynamiques |
Exemples
Imaginons que tu développes un système de paiement avec des exigences distinctes : séparer l'abstraction de l'implémentation ou choisir dynamiquement la méthode de paiement en fonction des besoins.
1. Bridge Pattern
Séparer la logique de gestion des paiements (abstraction) des différentes méthodes de paiement (implémentation comme PayPal, Stripe).
$paypalPayment = new PayPalPayment();
$userAlert = new UserAlertNotification($paypalPayment);
$userAlert->notify('Payment successful via PayPal.');
2. Strategy Pattern
Choisir dynamiquement la méthode de paiement en fonction des préférences de l'utilisateur.
$paymentContext = new PaymentContext();
$paymentContext->setPaymentStrategy(new PayPalStrategy());
echo $paymentContext->executePayment(100); // "Paid 100 using PayPal"
Explications
Dans le Bridge Pattern, nous avons une séparation claire entre l'abstraction (la notification de l'utilisateur ou du système) et l'implémentation (la méthode de paiement utilisée). Cela permet d’ajouter de nouvelles méthodes de paiement, comme Stripe ou virement bancaire, sans changer la structure des notifications, ce qui facilite l'évolution du système.
Avec le Strategy Pattern, la méthode de paiement est choisie dynamiquement à l'exécution. Par exemple, l'utilisateur peut choisir de payer avec PayPal, Stripe ou virement bancaire, et cette décision n'affecte pas la logique générale de traitement des paiements. Chaque stratégie de paiement est encapsulée dans une classe distincte, permettant une flexibilité dans le choix de l'algorithme à utiliser.
Le Bridge Pattern est particulièrement utile pour découpler l’abstraction et l’implémentation, tandis que le Strategy Pattern est conçu pour gérer des algorithmes interchangeables et dynamiques.
Cas d'utilisation des patterns
Le Bridge Pattern est utile lorsque tu veux découpler une abstraction de ses implémentations et permettre à l'une ou l'autre de changer sans affecter l'autre. Par exemple, dans le cas d'un système de notification, tu peux ajouter de nouveaux types de notifications ou changer la manière dont elles sont envoyées (par exemple, en ajoutant un nouveau service de SMS) sans toucher à l'abstraction de notification.
Le Strategy Pattern est plus adapté aux situations où tu as besoin de choisir dynamiquement entre plusieurs algorithmes ou stratégies pour une tâche donnée. Par exemple, pour un système de paiement, tu peux avoir plusieurs méthodes de paiement, chacune encapsulée dans une stratégie, et choisir laquelle utiliser selon les besoins de l'utilisateur.
Conclusion
- Le Bridge Pattern est parfait lorsque tu veux séparer l'abstraction de l'implémentation et que les deux parties doivent évoluer indépendamment.
- Le Strategy Pattern convient mieux lorsque tu dois choisir dynamiquement un algorithme ou une stratégie en fonction des besoins de l'utilisateur ou du contexte.
Ces deux patterns apportent de la flexibilité au code, mais chacun dans des contextes et des usages spécifiques.