Использование шаблона стратегии и шаблона команды
оба шаблона проектирования инкапсулируют алгоритм и отделяют детали реализации от их вызывающих классов. Единственное различие, которое я могу заметить, заключается в том, что шаблон стратегии принимает параметры для выполнения, а шаблон команды-нет.
Мне кажется, что шаблон команды требует, чтобы вся информация для выполнения была доступна при ее создании, и он может задержать ее вызов (возможно, как часть скрипта).
какие определения руководство использовать ли один шаблон или другой?
7 ответов
Я включаю таблицу иерархии инкапсуляции нескольких шаблонов дизайна GoF, чтобы помочь объяснить различия между этими двумя шаблонами. Надеюсь, это лучше иллюстрирует, что каждый инкапсулирует, поэтому мое объяснение имеет больше смысла.
во-первых, иерархия перечисляет область, для которой применяется данный шаблон, или соответствующий шаблон для инкапсуляции некоторого уровня детализации, в зависимости от того, с какой стороны таблицы вы начинаете на.
Как вы можете видеть из таблицы, объект шаблона стратегии скрывает детали реализации алгоритма, поэтому использование другого объекта стратегии будет выполнять ту же функциональность, но по-другому. Каждый объект стратегии может быть оптимизирован для определенного фактора или работать с каким-либо другим параметром; и благодаря использованию общего интерфейса контекст может безопасно работать с любым из них.
шаблон Command инкапсулирует много меньший уровень детализации, чем алгоритм. Он кодирует данные, необходимые для отправки сообщения объекту: приемник, селектор и аргументы. Преимущество объективизации такой крошечной части выполнения процесса заключается в том, что такие сообщения могут вызываться в разные моменты времени или местоположения в общем виде без необходимости жесткого кода его деталей. Он позволяет вызывать сообщения один или несколько раз или передавать их в различные части системы или несколько систем, не требуя подробностей о конкретном вызове, который должен быть известен до выполнения.
как типично для шаблонов проектирования, они не требуют, чтобы все реализации были идентичны в деталях, чтобы носить имя шаблона. Детали могут отличаться в реализации и в том, какие данные кодируются в объекте по сравнению с аргументами метода.
стратегии алгоритмы инкапсуляции. Команды отделяют отправителя от получателя запроса, они превращают запрос в объект.
Если это алгоритм, как что-то будет сделано, использовать стратегию. Если вам нужно отделить вызов метода от его выполнения, используйте команду. Команды часто используются при построении очередей сообщений для последующего использования, например задачи или транзакции.
ответ на очень старый вопрос. (кто-нибудь видит последние ответы вместо большинства проголосовавших?)
это действительно путаница, чтобы иметь из-за сходства. Как стратегия, так и командные шаблоны используют инкапсуляция. Но это не делает их одинаковыми.
ключевая разница-понять что инкапсулируется. Принцип ОО, от которого зависят оба паттерна, - это инкапсулировать то, что меняет.
В случае стратегия, что варьируется алгоритм. Например, один объект стратегии знает, как выводить в XML-файл, а другой выводит, скажем, в JSON. Сохраняются различные алгоритмы (капсулированные) в разных классах. Все очень просто.
в случае команды, что варьируется запрос. Запрос может исходить от File Menu > Delete
или Right Click > Context Menu > Delete
или Just Delete Button pressed
. Все три случая могут генерировать 3 объекта команд одного типа. Эти объекты только представляют 3 запроса на удаление; не алгоритм удаления. Поскольку запросы теперь являются кучей объектов, мы могли бы легко управлять ими. Внезапно становится тривиальным предоставлять такие функции, как отмена или повтор.
не имеет значения, как команда реализует запрошенную логику. При вызове execute () он может реализовать алгоритм для запуска удаления или даже делегировать его другим объектам, может даже делегировать стратегию. Это только детали реализации шаблона команды. Это почему он называется команда хотя это не вежливый способ запрос :--)
сравните его со стратегией; этот шаблон касается только фактического логика это выполняется. Если мы это сделаем, это поможет достичь различных комбинаций поведения с минимальным набором классов, тем самым предотвращая взрыв класса.
Я думаю, команда помогает нам расширить наше понимание инкапсуляции, в то время как стратегия обеспечивает естественное использование инкапсуляция и полиморфизм.
Как я смотрю на это, у вас есть несколько способов сделать то же самое, каждый из них является стратегией, и что-то во время выполнения определяет, какая стратегия будет выполнена.
возможно, сначала попробуйте StrategyOne, если результаты недостаточно хороши, попробуйте StrategyTwo...
команды связаны с различными вещами, которые должны произойти, как TryToWalkAcrossTheRoomCommand. Эта команда будет срабатывать всякий раз, когда какой-то объект попытается пройти через комнату, но внутри нее, он может попробовать StrategyOne и StrategyTwo за попытку пройти через комнату.
Марк
Я могу ошибаться в своем мнении, но я лечу команда как функция для выполнения или реакция. Должно быть как минимум два игрока: тот, кто запрашивает действие, и тот, кто выполняет действие. GUI является типичным примером для шаблона команды:
- все кнопки на панели инструментов приложения связаны с какими-то действий.
- кнопка является исполнителем в этом случае.
- действие-это команда в этом случай.
команда обычно ограничена некоторой областью или бизнес-областью, но не обязательно: у вас могут быть команды, которые выдают счет, запускают ракету или удаляют файл, реализующий тот же интерфейс (например, single execute()
метод) в пределах одного приложения. Часто команды являются самодостаточными, поэтому им ничего не нужно от исполнителя для обработки поставленной задачи (вся необходимая информация предоставляется во время построения), иногда команды контекстно-зависимы и должен быть в состоянии обнаружить этот контекст (Backspace команда должна знать позицию курсора в тексте, чтобы правильно удалить предыдущий символ;откат команда должна обнаружить текущую транзакцию для отката; ...).
на стратегия немного отличается: он больше привязан к некоторой области. Стратегия может определить правило для форматирования даты (в формате UTC? локалей?) (стратегия "форматирование даты") или вычисление квадрата для геометрическая фигура (стратегия "квадратный калькулятор"). Стратегии - это в этом смысле объекты flyweight, которые берут что-то в качестве входных данных ("дата", "рисунок", ...) и принять какое-то решение на ее основе. Возможно, не самый лучший, но хороший пример стратегии связан с javax.xml.transform.Source
интерфейс: в зависимости от того, является ли переданный объект DOMSource
или SAXSource
или StreamSource
стратегия (=XSLT transformer в этом случае) будет применять разные правила для ее обработки. Реализация может быть простой switch
или привлекать схема ответственности.
но действительно есть что-то общее между этими двумя шаблонами: команды и стратегии инкапсулируют алгоритмы в одной семантической области.
команда:
основные компоненты:
-
команда объявляет интерфейс для абстрактных команд, таких как
execute()
- приемник знает, как выполнить определенную команду
- Invoker держит ConcreteCommand, который должен быть исполнен
- клиент создает ConcreteCommand и назначить приемник
- ConcreteCommand определяет привязку между команда и приемник
документооборот:
клиент звонки Invoker =>Invoker звонки ConcreteCommand =>ConcreteCommand звонки приемник метод, который реализует абстрактное команда метод.
преимущество: клиент не влияет на изменения в команде и приемнике. Invoker обеспечивает свободное соединение между клиентом и приемником. Вы можете запускать несколько команд с одним и тем же Invoker.
команда шаблон позволяет выполнять команду на различных ресивер при использовании же Invoker. Invoker не знает о типе приемник
для лучшего понимания концепций, посмотрите на этот JournalDev статьи by Панкадж Кумар и dzone статьи by Джеймс Сагру в дополнение к ссылке в Википедии.
можно использовать команда шаблон
разъединить вызывающего и приемника команды
практическое руководство механизм
реализовать функции отмены и повтора
ведение истории команд
java.lang.Thread
одна хорошая реализация команда узор. Вы можете лечить нить как invoker & class реализация Runnable as ConcreteCommonad/Приемник и run()
метод as команда.
Undo / Redo версия шаблона команды может читайте в Теодор Норвелл-х статьи
стратегия:
шаблон стратегии очень прост для понимания. Используйте этот шаблон, когда
у вас есть несколько реализаций алгоритма и реализация алгоритма может меняться во время выполнения в зависимости от конкретных условий.
пример тариф системы бронирования авиабилетов компонент
авиакомпании хотели бы предложить различные тарифы в разные периоды времени-пиковые и пиковые месяцы. В дни пиковых поездок он хотел бы стимулировать спрос, предлагая привлекательные скидки.
основными выводами стратегия шаблон:
- это поведенческая модель
- он основан на делегировании
- он изменяет кишки объекта путем изменения метода поведение
- он используется для переключения между семейством алгоритмов
- он изменяет поведение объекта во время выполнения
связанные сообщения с примерами кода:
для меня разница заключается в намерении. Реализации обоих шаблонов довольно похожи, но имеют разные цели:
для стратегии компонент, использующий объект, знает что объект делает (и будет использовать его для выполнения части своей собственной работы), но ему все равно как он это делает.
для команды компонент, использующий объект, не знает ни что команды ни как он делает это - он просто знает, как его вызвать. Задача вызывающего абонента - просто выполнить команду-обработка, выполняемая командой, не является частью основной работы вызывающего абонента.
в этом разница-действительно ли объект, использующий компонент, знает или заботится о том, что делает компонент? В большинстве случаев это можно определить на основе того, возвращает ли объект pattern значение вызывающему объекту. Если invoker заботится о том, что pattern object делает то, что он, вероятно, захочет вернуть что-то, и это будет стратегия. Если он не заботится о каких-либо возвращаемое значение это, вероятно, команду (обратите внимание, что-то вроде Ява вызываться еще команду, потому что, хотя она возвращает значение, абонент не заботятся о стоимости - она просто передает его, что изначально поставила команда).