2.1 State

Состояние (State) — поведенческий шаблон проектирования. Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния.

Состояние (State)

Паттерн состоит из 3 блоков:

Context — класс, объекты которого должны менять своё поведение в зависимости от состояния.

State — интерфейс, который должен реализовать каждое из конкретных состояний. Через этот интерфейс объект Context взаимодействует с состоянием, делегируя ему вызовы методов. Интерфейс должен содержать средства для обратной связи с объектом, поведение которого нужно изменить.

Для этого используется событие (паттерн Publisher — Subscriber). Это необходимо для того, чтобы в процессе выполнения программы заменять объект состояния при появлении событий. Возможны случаи, когда сам Context периодически опрашивает объект состояния на наличие перехода.

ConcreteState1, ConcreteState2 — классы конкретных состояний. Должны содержать информацию о том, при каких условиях и в какие состояния может переходить объект из текущего состояния. Например, из ConcreteState1 объект может переходить в состояние ConcreteState2 и ConcreteState3, а из ConcreteState2 — обратно в ConcreteState1 и так далее. Объект одного из них должен содержать Context при создании.

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

Состояние твоего персонажа можно описать объектом State, у которого есть методы, которые можно вызывать и которые будут что-то делать. И после того, как твой персонаж залез в воду, ты просто меняешь у него внутри ссылку на другой объект State — и он меняет свое состояние.

2.2 Strategy

Стратегия (Strategy) — поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путём определения соответствующего класса.

Шаблон Strategy позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.

Стратегия (Strategy)

Паттерн Стратегия позволяет использовать различные бизнес-правила или алгоритмы в зависимости от контекста. Применяется в случаях, когда в одном и том же месте в зависимости от текущего состояния системы (или её окружения) должны использоваться различные алгоритмы.

Сильные стороны:

  • инкапсуляция реализации различных алгоритмов, система становится независимой от возможных изменений бизнес-правил;
  • вызов всех алгоритмов одним стандартным образом;
  • отказ от использования переключателей и/или условных операторов.

Этот паттерн чем-то похож на паттерн State, однако тут акцент сделан не на состояние, а на поведение. Допустим, персонаж в твоей игре может менять оружие. Тогда при смене оружия можно просто поменять ссылку на объект, которые описывает, как это оружие работает.

2.3 Template Method

Template Method

Abstract class (абстрактный класс) — определяет абстрактные операции, замещаемые в наследниках для реализации шагов алгоритма; реализует шаблонный метод, определяющий скелет алгоритма. Шаблонный метод вызывает замещаемые и другие, определенные в Abstract class, операции.

Concrete class (конкретный класс) — реализует замещаемые операции необходимым для реализации способом. Concrete class предполагает, что инвариантные шаги алгоритма будут выполнены в AbstractClass.

Этот паттерн часто используется, когда надо:

  • Однократное использование инвариантной части алгоритма с оставлением изменяющейся части на усмотрение наследникам.
  • Локализация и вычленение общего для нескольких классов кода для избегания дублирования.
  • Разрешение расширения кода наследниками только в определенных местах.

Да, этот паттерн описывает использование пары: абстрактный класс и его реализация.

2.4 Chain of Responsibility

Цепочка обязанностей (Chain of responsibility) — поведенческий шаблон проектирования, предназначенный для организации в системе уровней ответственности

Цепочка обязанностей (Chain of responsibility)

Шаблон рекомендован для использования в условиях, когда:

  • в разрабатываемой системе имеется группа объектов, которые могут обрабатывать сообщения определенного типа;
  • все сообщения должны быть обработаны хотя бы одним объектом системы;
  • сообщения в системе обрабатываются по схеме “обработай сам или перешли другому”, то есть одни сообщения обрабатываются на том уровне, где они получены, а другие пересылаются объектам другого уровня.

2.5 Memento

Хранитель (Memento) — поведенческий шаблон проектирования, позволяющий не нарушая инкапсуляцию зафиксировать и сохранить внутреннее состояние объекта так, чтобы позднее восстановить его в это состояние.

Хранитель (Memento)

Шаблон Хранитель используется, когда:

  • необходимо сохранить снимок состояния объекта (или его части) для последующего восстановления;
  • прямой интерфейс получения состояния объекта раскрывает детали реализации и нарушает инкапсуляцию объекта.
undefined
1
Задача
Модуль 3. Java Professional, 17 уровень, 1 лекция
Недоступна
Usb mp3 плеер
Паттерн State
undefined
1
Задача
Модуль 3. Java Professional, 17 уровень, 1 лекция
Недоступна
Стратегический шопинг
Паттерн Strategy
undefined
1
Задача
Модуль 3. Java Professional, 17 уровень, 1 лекция
Недоступна
Игра как жизнь
Паттерн Template method
undefined
1
Задача
Модуль 3. Java Professional, 17 уровень, 1 лекция
Недоступна
Техподдержка
Паттерн Chain of responsibility
undefined
1
Задача
Модуль 3. Java Professional, 17 уровень, 1 лекция
Недоступна
Memento mori
Паттерн Memento