Государственный образец - State pattern

В государственный образец это поведенческий шаблон разработки программного обеспечения что позволяет объекту изменять свое поведение при изменении его внутреннего состояния. Этот паттерн близок к концепции конечные автоматы. Паттерн состояний можно интерпретировать как шаблон стратегии, который может переключать стратегию с помощью вызовов методов, определенных в интерфейсе шаблона.

Шаблон состояния используется в компьютерное программирование инкапсулировать различное поведение для одного и того же объект, исходя из его внутреннего состояния. Это может быть более чистый способ для объекта изменить свое поведение во время выполнения без использования условных операторов и, таким образом, улучшить ремонтопригодность.[1]:395

Обзор

Пример класса UML и диаграммы последовательности для шаблона проектирования State.[2]

Паттерн государственного проектирования - один из двадцати трех шаблоны проектирования, задокументированные Бандой четырех которые описывают, как решать повторяющиеся проблемы дизайна. Такие проблемы охватывают разработку гибкого и многократно используемого объектно-ориентированного программного обеспечения, например объектов, которые легко реализовать, изменить, протестировать и повторно использовать.[3]

Шаблон состояний предназначен для решения двух основных проблем:[4]

  • Объект должен изменить свое поведение при изменении его внутреннего состояния.
  • Поведение, зависящее от состояния, следует определять независимо. То есть добавление новых состояний не должно влиять на поведение существующих состояний.

Реализация поведения, зависящего от состояния, непосредственно внутри класса является негибкой, поскольку она фиксирует класс для определенного поведения и делает невозможным добавление нового состояния или изменение поведения существующего состояния позже независимо от (без изменения) класса. В этом шаблоне описаны два решения:

  • Определите отдельные (состояния) объекты, которые инкапсулируют поведение, зависящее от состояния, для каждого состояния. То есть определите интерфейс (состояние) для выполнения поведения, зависящего от состояния, и определите классы, реализующие интерфейс для каждого состояния.
  • Класс делегирует поведение, зависящее от состояния, своему объекту текущего состояния вместо того, чтобы напрямую реализовывать поведение, зависящее от состояния.

Это делает класс независимым от того, как реализовано поведение, зависящее от состояния. Новые состояния могут быть добавлены путем определения новых классов состояний. Класс может изменить свое поведение во время выполнения, изменив свой объект текущего состояния.

Структура

Состояние в UML[1]

В сопутствующем Единый язык моделирования (UML) диаграмма классов, то Контекст class не реализует напрямую зависящее от состояния поведение. Вместо, Контекст относится к государство интерфейс для выполнения зависящего от состояния поведения (state.operation ()), что делает Контекст независимо от того, как реализовано поведение, зависящее от состояния. В Состояние1 и Состояние2 классы реализуют государство интерфейс, то есть реализовать (инкапсулировать) поведение, зависящее от состояния для каждого состояния. UML схема последовательности показывает взаимодействия во время выполнения:

В Контекст объект делегирует поведение, зависящее от состояния, различным государство объекты. Первый, Контекст звонки операция (это) на его текущем (начальном) состоянии объекта (Состояние1), который выполняет операцию и вызывает setState (State2) на Контекст изменить текущее состояние контекста на Состояние2. В следующий раз, Контекст снова звонит операция (это) на его текущем состоянии объекта (Состояние2), который выполняет операцию и изменяет текущее состояние контекста на Состояние1.

пример

Ява

Интерфейс состояний и две реализации. Метод состояния имеет ссылку на объект контекста и может изменять его состояние.

интерфейс государство {    пустота writeName(StateContext контекст, Строка имя);}класс LowerCaseState орудия государство {    @Override    общественный пустота writeName(StateContext контекст, Строка имя) {        Система.вне.println(имя.toLowerCase());        контекст.setState(новый MultipleUpperCaseState());    }}класс MultipleUpperCaseState орудия государство {    / * Счетчик, локальный для этого состояния * /    частный int считать = 0;    @Override    общественный пустота writeName(StateContext контекст, Строка имя) {        Система.вне.println(имя.toUpperCase());        / * Изменяем состояние после того, как функция writeName () StateMultipleUpperCase вызывается дважды * /        если (++считать > 1) {            контекст.setState(новый LowerCaseState());        }    }}

Класс контекста имеет переменную состояния, которую он создает в начальном состоянии, в данном случае LowerCaseState. В своем методе он использует соответствующие методы объекта состояния.

класс StateContext {    частный государство штат;        общественный StateContext() {        штат = новый LowerCaseState();    }    /**     * Установить текущее состояние.     * Обычно вызывается только классами, реализующими интерфейс State.     * @param newState новое состояние этого контекста     */    пустота setState(государство newState) {        штат = newState;    }    общественный пустота writeName(Строка имя) {        штат.writeName(этот, имя);    }}

На демонстрации ниже показано использование:

общественный класс StateDemo {    общественный статический пустота основной(Строка[] аргументы) {        StateContext контекст = новый StateContext();        контекст.writeName("Понедельник");        контекст.writeName("Вторник");        контекст.writeName("Среда");        контекст.writeName("Четверг");        контекст.writeName("Пятница");        контекст.writeName("Суббота");        контекст.writeName("Воскресенье");    }}

С помощью приведенного выше кода вывод главный() от StateDemo является:

 понедельник вторник среда Четверг Пятница Суббота воскресенье

использованная литература

  1. ^ а б Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон М. Влиссидес (1995). Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Эддисон-Уэсли. ISBN  0-201-63361-2.CS1 maint: использует параметр авторов (ссылка на сайт)
  2. ^ «Государственный образец проектирования - структура и взаимодействие». w3sDesign.com. Получено 2017-08-12.
  3. ^ Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес (1994). Паттерны проектирования: элементы объектно-ориентированного программного обеспечения многократного использования. Эддисон Уэсли. стр.305ff. ISBN  0-201-63361-2.CS1 maint: несколько имен: список авторов (ссылка на сайт)
  4. ^ «Паттерн государственного проектирования - проблема, решение и применимость». w3sDesign.com. Получено 2017-08-12.