Состояние (State) — различия между версиями
Admin (обсуждение | вклад) (→Достоинства и недостатки) |
Admin (обсуждение | вклад) (→Достоинства и недостатки) |
||
Строка 37: | Строка 37: | ||
=== Достоинства и недостатки === | === Достоинства и недостатки === | ||
* Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state. | * Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state. | ||
− | * Ликвидирует ветвление, которое возникает в обычной реализации | + | * Ликвидирует ветвление, которое возникает в обычной реализации. |
− | * Делает явным переход между состояниями | + | * Делает явным переход между состояниями (при изменении переменной состояния) |
+ | * Действия в зависимости от состояния разбросаны по многим классам, и за этим может быть трудно следить. | ||
=== Варианты === | === Варианты === | ||
* | * |
Версия 10:15, 22 июля 2014
Назначение
Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).
Описание
При каждом изменении состояния объект-Контекст меняет свой подобъект состояния ConcreteState.
Именно ConcreteState реализует обработку запроса.
Использование
Паттерн используется когда поведение объекта зависит от состояния, которое может меняться.
Если в коде операций встречаются состоящие из многих ветвей условные операторы, где выбор ветви зависит от состояния, , то использование паттерна Состояние позволяет избавиться от этой тяжеловесной конструкции, поместив каждую ветвь в отдельный класс.
Реализация
Диаграмма классов
Участники
- Context - контекст
- Определяет интерфейс, интересный для клиентов
- Хранит экземпляр класса ConcreteState
- State - состояние
- Определяет интерфейс поведения, связанного с конкретным состоянием (метод Handle())
- ConcreteState - конкретное состояние
- Реализует интерфейс Handle()
Класс Context хранит объект ConcreteState и делегирует ему зависящие от состояния запросы.
Контекст может передавать себя в качестве параметра методу Handle() объекта State, обрабатывающего запрос.
Либо Context либо ConcreteState могут решать, каким образом происходит смена состояний.
Код
Достоинства и недостатки
- Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state.
- Ликвидирует ветвление, которое возникает в обычной реализации.
- Делает явным переход между состояниями (при изменении переменной состояния)
- Действия в зависимости от состояния разбросаны по многим классам, и за этим может быть трудно следить.