Паттерны проектирования. Поведенческие шаблоны.

Стратегия, состояние, команда, цепочка обязанностей. Краткое содержание Стратегия, состояние, команда, цепочка обязанностей. ФС Стратегия (Strategy) Паттерн Стратегия предлагает определить семейство схожих алгоритмов, которые часто изменяются или расширяются, и вынести их в собственные классы, называемые стратегиями. Когда вспомнить о шаблоне Стратегия? 1. Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта. 2. Когда у вас есть множество похожих классов, отличающихся только некоторым поведением. 3. Когда вы не хотите обнажать детали реализации алгоритмов для других классов. 4. Когда различные вариации алгоритмов реализованы в виде развесистого условного оператора. Каждая ветка такого оператора представляет собой вариацию алгоритма. Плюсы vs. Минусы Плюсы: 1. Горячая замена алгоритмов на лету. 2. Изолирует код и данные алгоритмов от остальных классов. 3. Уход от наследования к делегированию. 4. Реализует принцип открытости/закрытости. Минусы: 1. Усложняет программу за счёт дополнительных классов. 2. Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую. Состояние (State) Состояние — объект меняет поведение в зависимости от своего состояния, создавая впечатление подмены класса объекта. При этом как правило существует четкий список переходов из одних состояний в другие. Знакомо? Думаю, да. Правильно! Это же конечный автомат (state machine). Контекст не выполняет действия, он делегирует эти обязанности объектам-состояниям. Когда вспомнить о шаблоне Состояние? 1. Когда имеется объект, поведение которого кардинально меняется в зависимости от внутреннего состояния, причём типов состояний много, и они часто меняются. 2. Когда код класса содержит множество больших, похожих друг на друга условных операторов, которые выбирают поведения в зависимости от текущих значений полей класса. 3. Когда используется табличная машина состояний, построенная на условных операторах и приводящая к дублированию кода для похожих состояний и переходов. Плюсы vs. Минусы Плюсы: 1. Избавляет от множества больших условных операторов машины состояний. 2. Концентрирует в одном месте код, связанный с определённым состоянием. 3. Упрощает код контекста. Минусы: 1. Может неоправданно усложнить код, если состояний мало и они редко меняются. Отличие от Стратегии Состояние можно рассматривать как надстройку над Стратегией. Оба паттерна используют композицию, чтобы менять поведение основного объекта, делегируя работу вложенным объектам-помощникам. Однако в Стратегии эти объекты не знают друг о друге и никак не связаны. В Состоянии сами конкретные состояния могут переключать контекст. Команда (Command) Поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их, а также поддерживать отмену операций. Плюсы vs. Минусы Плюсы: 1. Убирает прямую зависимость между объектами, вызывающими операции, и объектами, которые их непосредственно выполняют. 2. Позволяет реализовать простую отмену и повтор операций. 3. Позволяет реализовать отложенный запуск операций. 4. Позволяет собирать сложные команды из простых. 5. Реализует принцип открытости/закрытости. Минусы: 1. Усложняет код программы из-за введения множества дополнительных классов. Цепочка обязанностей (CoR – Chain of Responsibility). Поведенческий паттерн проектирования, который позволяет передавать запросы последовательно по цепочке обработчиков. Каждый последующий обработчик решает, может ли он обработать запрос сам и стоит ли передавать запрос дальше по цепи. Когда вспомнить о шаблоне CoR? Когда программа должна обрабатывать разнообразные запросы несколькими способами, но заранее неизвестно, какие конкретно запросы будут приходить и какие обработчики для них понадобятся. Когда важно, чтобы обработчики выполнялись один за другим в строгом порядке. Когда набор объектов, способных обработать запрос, должен задаваться динамически. Плюсы vs. Минусы Плюсы: 1. Уменьшает зависимость между клиентом и обработчиками. 2. Реализует принцип единственной обязанности. 3. Реализует принцип открытости/закрытости. Минусы: 1. Запрос может остаться никем не обработанным. Закрепим 1. Стратегия предлагает определить семейство схожих алгоритмов, которые часто изменяются или расширяются, и вынести их в собственные классы, называемые стратегиями. 2. Состояние позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта. 3. Команда превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов. 4. Цепочка обязанностей позволяет передавать запросы последовательно по цепочке обработчиков.
Back to Top