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

Глядя на шаблоны GoF, я нахожу довольно поразительным сходство между шаблоном State и Stategy. Оба заменяют полиморфные классы, чтобы изменить поведение. Кто-нибудь еще нашел то же самое?

Какие точные отличия?


person Community    schedule 08.08.2013    source источник
comment
Дубликат stackoverflow.com/questions/1658192/   -  person Wade Anderson    schedule 08.08.2013


Ответы (2)


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

  1. В шаблоне состояния клиент ничего не знает об объектах состояния. Изменения состояния происходят прозрачно для клиента. Клиент просто вызывает методы в контексте, контекст контролирует свое состояние. Поскольку клиент не знает об изменениях состояния, ему кажется, что контекст создается из другого класса каждый раз, когда происходит изменение поведения из-за изменения состояния. Объект будет казаться изменяющим свой класс в соответствии с официальным определением состояний шаблона. Шаблон построен вокруг четко определенной серии переходов между состояниями. Изменение состояния - ключ к существованию паттерна.

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

    Для получения дополнительной информации см. Ссылку ниже http://myrandomsparks.blogspot.in/2012/05/strategy-vs-state-pattern.html

person Mahesh    schedule 08.08.2013
comment
Таким образом, изменения поведения НЕ прозрачны для «клиента» и инициируются и контролируются клиентом. Думаю, это не «клиент», а «контекст». - person Anu Thomas Chandy; 06.08.2014
comment
@AnuThomasChandy, в этом контексте то же самое. - person wm.p1us; 22.08.2017

Шаблон стратегии определяет, "как" выполнить какое-либо действие, а шаблон состояния определяет "когда" их выполнить.

При использовании шаблона состояния класс, удерживающий состояние (контекст), освобождается от знания того, что это за состояние или тип и какие состояния или типы доступны. Это означает, что класс придерживается принципа открытого-закрытого дизайна (OCP): класс закрыт для изменений в том, какие состояния / типы существуют, но состояния / типы открыты для расширений.

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

person Toseef Khilji    schedule 08.08.2013