Відповідаючи на дуже давнє запитання. (хтось бачить останні відповіді замість більшості голосів?)
Це дійсна плутанина через подібність. І схеми стратегії, і командування використовують інкапсуляцію . Але це не робить їх однаковими.
Ключова відмінність полягає в розумінні того, що інкапсульовано. Принцип ОО, від якого залежать обидва шаблони, полягає в інкапсуляції того, що змінюється .
Що стосується стратегії, то різниться алгоритм . Наприклад, один об’єкт стратегії знає, як вивести файл XML, а інший виводить, скажімо, в JSON. У різних класах зберігаються ( інкапсульовані ) різні алгоритми . Це так просто.
У випадку команди, що змінюється, - це сам запит . Запит може надходити від File Menu > Delete
або Right Click > Context Menu > Delete
або Just Delete Button pressed
. Усі три випадки можуть генерувати 3 командні об'єкти одного типу. Ці командні об'єкти представляють лише 3 запити на видалення; не алгоритм видалення. Оскільки запити зараз є безліччю об’єктів, ми могли легко ними керувати. Раптом стає тривіально надати такі функції, як скасувати чи повторити.
Не має значення, як команда реалізує запитувану логіку. При виклику Execute () він може реалізувати алгоритм для запуску видалення або навіть делегувати його іншим об'єктам, навіть делегувати стратегію. Це лише деталізація реалізації командного шаблону. Ось чому його називають командою, хоча це не ввічливий спосіб запитувати : -)
Протиставляйте це стратегії; ця закономірність стосується лише фактичної логіки, яка виконується. Якщо ми це зробимо, це допоможе досягти різних комбінацій поведінки з мінімальним набором класів, тим самим запобігаючи вибуху класу.
Я думаю, що Command допомагає нам розширити розуміння інкапсуляції, тоді як Стратегія забезпечує природне використання інкапсуляції та поліморфізму.