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

Стратегия, состояние, команда, цепочка обязанностей. Краткое содержание Стратегия, состояние, команда, цепочка обязанностей. Стратегия (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