Réponse à une très vieille question. (quelqu'un voit-il les dernières réponses au lieu des plus votées ?)
Il s'agit d'une confusion valable en raison des similitudes. Les modèles de stratégie et de commandement utilisent tous deux encapsulation . Mais cela ne les rend pas identiques.
La différence essentielle est de comprendre ce que est encapsulé. Le principe OO, dont dépendent les deux patrons, est le suivant Encapsuler ce qui varie .
En cas de stratégie, ce qui varie est algorithme . Par exemple, un objet stratégique sait comment produire un fichier XML, tandis que l'autre produit un fichier JSON, par exemple. Des algorithmes différents sont conservés ( encapsulé ) dans des classes différentes. C'est aussi simple que cela.
En cas de commandement, ce qui varie est le demande lui-même. La demande peut provenir de File Menu > Delete
o Right Click > Context Menu > Delete
o Just Delete Button pressed
. Ces trois cas peuvent générer 3 objets de commande du même type. Ces objets de commande ne représentent que 3 demandes de suppression, et non l'algorithme de suppression. Puisque les demandes sont maintenant des objets, nous pouvons les gérer facilement. Soudain, il devient trivial de fournir des fonctionnalités telles que undo ou redo.
La façon dont la commande met en œuvre la logique demandée n'a pas d'importance. En appelant execute(), elle peut mettre en œuvre un algorithme pour déclencher la suppression ou elle peut même le déléguer à d'autres objets, voire à une stratégie. Il ne s'agit que d'un détail d'implémentation du pattern command. C'est pourquoi il est appelé commande bien que ce ne soit pas une façon polie de demande :--)
Contrairement à la stratégie, ce modèle ne s'intéresse qu'à l'action réelle. logique qui est exécuté. Si nous faisons cela, cela permet d'obtenir différentes combinaisons de comportements avec un ensemble minimal de classes, évitant ainsi l'explosion des classes.
Je pense que Command nous aide à élargir notre compréhension de l'encapsulation tandis que Strategy permet une utilisation naturelle de l'encapsulation et du polymorphisme.