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