Глядя на шаблоны GoF, я нахожу довольно поразительным сходство между шаблоном State и Stategy. Оба заменяют полиморфные классы, чтобы изменить поведение. Кто-нибудь еще нашел то же самое?
Какие точные отличия?
Глядя на шаблоны GoF, я нахожу довольно поразительным сходство между шаблоном State и Stategy. Оба заменяют полиморфные классы, чтобы изменить поведение. Кто-нибудь еще нашел то же самое?
Какие точные отличия?
Шаблоны состояния и стратегии похожи в том смысле, что оба они инкапсулируют поведение в отдельные объекты и используют композицию для делегирования составному объекту для реализации поведения, и оба они обеспечивают гибкость для динамического изменения поведения путем изменения составного объекта в время выполнения. Но есть несколько ключевых отличий:
В шаблоне состояния клиент ничего не знает об объектах состояния. Изменения состояния происходят прозрачно для клиента. Клиент просто вызывает методы в контексте, контекст контролирует свое состояние. Поскольку клиент не знает об изменениях состояния, ему кажется, что контекст создается из другого класса каждый раз, когда происходит изменение поведения из-за изменения состояния. Объект будет казаться изменяющим свой класс в соответствии с официальным определением состояний шаблона. Шаблон построен вокруг четко определенной серии переходов между состояниями. Изменение состояния - ключ к существованию паттерна.
Несмотря на то, что шаблон стратегии обеспечивает гибкость для изменения поведения путем динамического изменения составного объекта стратегии, в большинстве случаев соответствующий объект стратегии уже установлен для каждого контекста. т.е. даже несмотря на то, что шаблон предоставляет способ динамически изменять составной объект стратегии, особой необходимости в этом нет. Даже если это нужно сделать, изменения вносит именно клиент. Клиент вызовет метод установки в контексте и передаст новый объект стратегии. Таким образом, изменения поведения НЕ прозрачны для клиента и инициируются и контролируются клиентом. Шаблон не поощряет серию четко определенных изменений поведения, таких как шаблон состояния. Клиент знает об объектах стратегии и обычно устанавливает соответствующий объект стратегии в контексте при его создании. Клиент контролирует, какой объект стратегии использует контекст, но в шаблоне состояния клиент ничего не знает об объектах состояния, которые использует контекст.
Для получения дополнительной информации см. Ссылку ниже http://myrandomsparks.blogspot.in/2012/05/strategy-vs-state-pattern.html
Шаблон стратегии определяет, "как" выполнить какое-либо действие, а шаблон состояния определяет "когда" их выполнить.
При использовании шаблона состояния класс, удерживающий состояние (контекст), освобождается от знания того, что это за состояние или тип и какие состояния или типы доступны. Это означает, что класс придерживается принципа открытого-закрытого дизайна (OCP): класс закрыт для изменений в том, какие состояния / типы существуют, но состояния / типы открыты для расширений.
При использовании шаблона стратегии класс, использующий алгоритм (контекст) освобождается от знания того, как выполнять определенную задачу (- «алгоритм»). Этот случай также создает приверженность OCP; класс закрыт для изменений относительно того, как выполнять эту задачу, но дизайн очень открыт для добавления других алгоритмов для решения этой задачи