Состояние (State) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Достоинства и недостатки)
(Достоинства и недостатки)
Строка 37: Строка 37:
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
 
* Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state.
 
* Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state.
* Ликвидирует ветвление, которое возникает в обычной реализации
+
* Ликвидирует ветвление, которое возникает в обычной реализации.
* Делает явным переход между состояниями
+
* Делает явным переход между состояниями (при изменении переменной состояния)
 +
* Действия в зависимости от состояния разбросаны по многим классам, и за этим может быть трудно следить.
  
 
=== Варианты ===
 
=== Варианты ===
 
*
 
*

Версия 10:15, 22 июля 2014

К основной странице курса

Назначение

Позволяет объекту менять своё поведение в зависимости от состояния. Состояние моделируется абстрактным объектом с множеством подобъектов (состояний).

Описание

При каждом изменении состояния объект-Контекст меняет свой подобъект состояния ConcreteState.

Именно ConcreteState реализует обработку запроса.

Использование

Паттерн используется когда поведение объекта зависит от состояния, которое может меняться.

Если в коде операций встречаются состоящие из многих ветвей условные операторы, где выбор ветви зависит от состояния, , то использование паттерна Состояние позволяет избавиться от этой тяжеловесной конструкции, поместив каждую ветвь в отдельный класс.

Реализация

Диаграмма классов

StateCommon.png

Участники

  • Context - контекст
    • Определяет интерфейс, интересный для клиентов
    • Хранит экземпляр класса ConcreteState
  • State - состояние
    • Определяет интерфейс поведения, связанного с конкретным состоянием (метод Handle())
  • ConcreteState - конкретное состояние
    • Реализует интерфейс Handle()

Класс Context хранит объект ConcreteState и делегирует ему зависящие от состояния запросы.

Контекст может передавать себя в качестве параметра методу Handle() объекта State, обрабатывающего запрос.

Либо Context либо ConcreteState могут решать, каким образом происходит смена состояний.

Код

Достоинства и недостатки

  • Реализует зависящее от состояния поведение и делит его на части, соответствующие состояниям. Помещает поведение, связанное с конкретным состоянием, в отдельный объект. Добавление новых состояний достигается порождением новых подклассов класса state.
  • Ликвидирует ветвление, которое возникает в обычной реализации.
  • Делает явным переход между состояниями (при изменении переменной состояния)
  • Действия в зависимости от состояния разбросаны по многим классам, и за этим может быть трудно следить.

Варианты