Разница между шаблоном стратегии и шаблоном состояния на примере

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

Скажите, пожалуйста, правильно ли я делаю или что не так?

Классы:

  • BeforeCondition: определяет уровень напряжения, количество топлива, состояние приводного ремня.
  • Baker: машина для выпечки печенья.
  • LowSpeedBaker, HighSpeedBaker, MediumSpeedBaker: различные реализации или, скорее, состояния Baker.
  • BakerStateFactory: принимает BeforeCondtion и возвращает одно из состояний Baker.

Реализация 1:

Клиент создает BeforeCondition и получает соответствующий пекарь из BakerStateFactory. Теперь он вызывает bake () of baker.

Реализация 2:

Клиента не волнует, как работает машина. Он просто передает BeforeCondition в машину Baker. Сам аппарат Baker определяет свое состояние на основе BeforeCondition.

Заключение

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

Во второй реализации машина сама может определять свое состояние и работать соответственно. При необходимости он также может свободно изменять свое состояние между процессами. Это государственный образец.


person Amit Kumar Gupta    schedule 12.05.2013    source источник
comment
Я бы ответил на вопрос: что определено в моем проекте? Если вы этого не знаете, вы не сможете решить, какой шаблон лучше в вашем случае. Мы создаем программное обеспечение для клиентов, чтобы решать их проблемы, поэтому нам нужно знать, в чем проблемы на самом деле :)   -  person    schedule 12.05.2013
comment
Я не хочу сравнивать, какой узор лучше или подходит для этого состояния. Но пытаюсь понять разницу между ними при их реализации.   -  person Amit Kumar Gupta    schedule 12.05.2013
comment
Думаю, вы хорошо ответили на свой вопрос. В вашем случае стратегия дает больше контроля пользователю класса, а состояние дает больше самоконтроля вашему классу.   -  person    schedule 12.05.2013
comment
ох, так что мое различие верно. Благодарность   -  person Amit Kumar Gupta    schedule 12.05.2013
comment
Поскольку я думаю, что ваш вывод все еще немного неясен, я написал вам небольшую историю ;-)   -  person Alexander    schedule 13.05.2013


Ответы (1)


На основе вашей примерной сцены:

Вы хотите использовать шаблон стратегии, когда вы используете только один алгоритм для каждого процесса выпечки. Алгоритмов много, но для каждого процесса выпечки вы используете только один из них. В этом случае вашими стратегиями для Baker могут быть CookieProcess, PizzaProcess, ... Чтобы испечь пиццу, вы настраиваете Baker на использование < em> PizzaProcess. Затем вы передаете ингредиенты методу bake (), и пицца отправляется на ваш почтовый ящик. Пойдите с этим, потому что думать о возвращаемом типе здесь может сбивать с толку, и вы тоже боретесь с фабричным шаблоном. Когда вы настраиваете Baker для использования CookieProcess, Baker запекает их и отправляет половину из них в центр города в почтовый ящик вашей бабушки.

Итак, здесь есть две разные стратегии:

  • запекать при 220 градусах Цельсия и отправлять на ваш почтовый ящик,
  • испечь при 180 по Цельсию и отправить вам и вашей бабушке

Если вы хотите смоделировать процесс выпечки более подробно, вы воспользуетесь шаблоном состояний. В этом случае ваши состояния могут быть BakerOff, BakerPreheating, BakerPreheatingDone, BakerHeating, BakerCooldown . Когда вы начинаете готовить шоколадное печенье для дурацкой конференции в пятницу, Baker находится в состоянии BakerOff. Несмотря на сонливость, вы пытаетесь вставить печенье, но у вас ничего не получается, за исключением того, что только плохие кондитеры выпекают свое печенье без предварительного нагрева. Итак, вы вызываете метод enable () объекта Baker. Внутреннее состояние изменится на BakerPreheating, а через некоторое время - на BakerPreheatingDone. При этом переходе состояния может быть вызван обратный вызов, например огромный, встроенный в BakerBell. Это напоминает вам о том, что нужно вставить файлы cookie и начать этап BakerHeating ...

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

Для опытного Пекаря вы можете комбинировать шаблоны. Тогда вы сможете печь пиццу и печенье в одном и том же Baker с помощью причудливого предварительного разогрева! Конечно, можно пропустить этап предварительного нагрева, когда Baker настроен для PizzaProcess.

Вы получаете пекаря, который может использовать разные стратегии (пицца, печенье). Каждый из них использует несколько состояний для завершения. Однако стратегия решает, какие состояния можно пропустить или поменять местами. (Возможно, в стратегии есть метод isPreheatingForced ())

person Alexander    schedule 12.05.2013