Отвечая на очень старый вопрос.(кто-нибудь видит последние ответы вместо самых проголосовавших?)
Это действительно путаница из-за сходства.Шаблоны стратегии и команды используют инкапсуляцию .Но это не делает их одинаковыми.
Ключевым отличием является понимание того, что заключено в капсулу.Принцип ОО, от которого зависят обе модели: Инкапсулирует то, что меняется .
В случае стратегии, что меняется, это алгоритм .Например, один объект стратегии знает, как выводить в файл XML, а другой выводит, скажем, в JSON.Различные алгоритмы хранятся ( инкапсулированы ) в разных классах.Это так просто.
В случае команды меняется только запрос .Запрос может поступить от File Menu > Delete
или Right Click > Context Menu > Delete
или Just Delete Button pressed
.Все три случая могут генерировать 3 командных объекта одного типа.Эти объекты команд представляют только 3 запроса на удаление;не алгоритм удаления.Поскольку запросы теперь представляют собой кучу объектов, мы могли бы легко ими управлять.Внезапно становится тривиально предоставлять такие функции, как отмена или повтор.
Не имеет значения, как команда реализует запрошенную логику.При вызове execute () он может реализовать алгоритм для запуска удаления или даже может делегировать его другим объектам, может даже делегировать стратегии.Это только деталь реализации шаблона команды.Вот почему она называется command , хотя это не вежливый способ request : -)
Сравните это со стратегией;этот шаблон касается только фактической логики , которая выполняется.Если мы сделаем это, это поможет достичь различных комбинаций поведения с минимальным набором классов, тем самым предотвращая взрыв классов.
Я думаю, что Command помогает нам расширить наше понимание инкапсуляции, в то время как Стратегия обеспечивает естественное использование инкапсуляции иполиморфизм.