В чем разница между шаблоном разработки Стратегии и шаблоном разработки State? - PullRequest
198 голосов
/ 01 ноября 2009

В чем различия между шаблоном разработки Стратегии и шаблоном разработки State? Я просматривал довольно много статей в Интернете, но не мог ясно различить разницу.

Может кто-нибудь объяснить разницу в выражениях непрофессионала?

Ответы [ 17 ]

2 голосов
/ 19 ноября 2016

Состояние поставляется с небольшими зависимостями внутри классов, производных от состояний: как одно состояние знает о других состояниях, следующих за ним. Например, Лето наступает после зимы для любого состояния сезона или Состояние доставки после состояния Депозит для покупок.

С другой стороны, у стратегии нет таких зависимостей. Здесь любое состояние может быть инициализировано на основе типа программы / продукта.

2 голосов
/ 14 октября 2016

Это довольно старый вопрос, но, тем не менее, я тоже искал те же ответы, и это то, что я обнаружил.

Для шаблона состояния рассмотрим пример кнопки воспроизведения проигрывателя Medial Player. Когда мы играем, он начинает играть и информирует контекст о том, что он играет. Каждый раз, когда клиент хочет выполнить операцию воспроизведения, он проверяет текущее состояние игрока. Теперь клиент знает, что состояние объекта воспроизводится через объект контекста, поэтому он вызывает метод действий объектов состояния паузы. Часть клиента, осознающая состояние и в каком состоянии ему необходимо выполнить действие, может быть автоматизирована.

https://www.youtube.com/watch?v=e45RMc76884 https://www.tutorialspoint.com/design_pattern/state_pattern.htm

В случае паттерна «Стратегия» расположение диаграммы классов совпадает с паттерном состояния. Клиент приходит к этой договоренности, чтобы сделать какую-то операцию. То есть вместо разных состояний существуют разные алгоритмы, например, различные анализы, которые необходимо выполнить для шаблона. Здесь клиенты сообщают контексту, что он хочет сделать, какой алгоритм (определенный пользователем бизнес-алгоритм), а затем выполняет это.

https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm

Оба реализуют принцип открытого закрытия, поэтому разработчик может добавлять новые состояния в шаблон состояний и новый алгоритм.

Но разница в том, что они используются, это шаблон состояния, используемый для выполнения другой логики, основанной на состоянии объекта. А в случае стратегии другая логика.

2 голосов
/ 01 ноября 2009

Оба шаблона делегируют базовому классу, который имеет несколько производных, но только в шаблоне State эти производные классы содержат ссылку на контекстный класс.

Другой способ взглянуть на это состоит в том, что шаблон «Стратегия» является более простой версией шаблона «Состояние»; подшаблон, если хотите. Это действительно зависит от того, хотите ли вы, чтобы производные состояния содержали ссылки обратно в контекст или нет (т.е. вы хотите, чтобы они вызывали методы в контексте).

Для получения дополнительной информации: Роберт С. Мартин (и Мика Мартин) ответят на это в своей книге «Гибкие принципы, модели и практики в C #». (http://www.amazon.com/Agile-Principles-Patterns-Practices-C/dp/0131857258)

1 голос
/ 28 апреля 2018

Короче говоря, с помощью паттерна стратегии мы можем установить некоторое поведение на лету, с паттерном состояния мы можем быть уверены, что объект изменит свое поведение внутренне с изменением своего состояния.

1 голос
/ 27 августа 2013

Стратегия и структура государства имеют одинаковую структуру. Если вы посмотрите на диаграмму классов UML для обоих шаблонов, они выглядят совершенно одинаково, но их намерения совершенно разные. Шаблон проектирования состояний используется для определения и управления состоянием объекта, а шаблон стратегии - для определения набора взаимозаменяемых алгоритмов и позволяет клиенту выбрать один из них. Таким образом, паттерн «Стратегия» является паттерном, управляемым клиентом, в то время как «Объект» может управлять этим состоянием.

1 голос
/ 01 ноября 2009

Разница обсуждается в http://c2.com/cgi/wiki?StrategyPattern. Я использовал шаблон Стратегии, позволяющий выбирать различные алгоритмы в общей структуре для анализа данных. Благодаря этому вы можете добавлять алгоритмы без необходимости изменять общие рамки и их логику.

Типичным примером является то, что у вас есть структура для оптимизации функции. Структура устанавливает данные и параметры. Шаблон стратегии позволяет вам выбирать алгоритмы, такие как спуски с помощью шагов, сопряженные градиенты, BFGS и т. Д., Не изменяя структуру.

0 голосов
/ 15 марта 2019

Когда у вас есть проект, который можно разделить на 2 задачи:

задача 1: для выполнения вы можете использовать один из двух разных алгоритмов: alg1, alg2

задача 2: для выполнения вы можете использовать один из трех различных алгоритмов: alg3, alg4, alg5

alg1 и alg2 являются взаимозаменяемыми; alg3, alg4 и alg5 являются взаимозаменяемыми.

Выбор алгоритма для выполнения задачи 1 и задачи 2 зависит от состояний:

состояние 1: вам нужно alg1 в задании 1 и alg3 в задании 2

состояние 2: вам нужно alg2 в задании 1 и alg5 в задании 2

Ваш контекст может изменить объект состояния из состояния 1 в состояние 2. Тогда ваша задача будет выполнена alg2 и alg5 вместо alg1 и alg3.

Вы можете добавить больше взаимозаменяемых алгоритмов для задачи 1 или задачи 2. Это шаблон стратегии.

В задаче 1 и задаче 2 может быть больше состояний с разными комбинациями алгоритмов. Шаблон состояний позволяет переключаться из одного состояния в другое и выполнять разные комбинации алгоритмов.

...