Определение состояния: разные состояния, разные поведения; или, другими словами, каждое состояние имеет соответствующее поведение.
Когда использовать режим состояния
Режим состояния чаще используется в фактическом использовании и подходит для «переключения состояний». Поскольку мы часто используем, если иначе, чтобы переключить состояния, если это решение о состоянии повторяется, нам нужно подумать о том, сможем ли мы принять режим состояния.
Не только на основе статуса, но и на атрибутах. Если свойства объекта различны, поведение объекта отличается. Свойства, такие изменения (переключение) свойств могут происходить в любое время, поэтому можно использовать состояние.
В реальном использовании существует много переключателей состояний, аналогичных переключателям, но иногда это не так очевидно, в зависимости от вашего опыта и глубины понимания системы.
Здесь мы хотим объяснить, что существуют некоторые различия между «состоянием переключения» и «Общим государственным решением».
Кода -копия выглядит следующим образом:
if (что == 1) state = "hello";
иначе if (что == 2) state = "hi";
иначе if (что == 3) state = "bye";
Это «общее государственное решение». Если изменилось на:
Кода -копия выглядит следующим образом:
if (state.euqals ("bye")) state = "hello";
иначе if (state.euqals ("hello")) state = "hi";
иначе if (state.euqals ("hi")) state = "bye";
Это «состояние переключения», которое состоит в том, чтобы переключить состояние состояния с «Привет» на «Привет», а затем на «пока»; Состояние может быть изменено режим состояния.
Если вы просто переключите направление «Привет»-> «Привет»-> «пока»-> «Привет» в вышеизложенном, вам не обязательно нужно использовать режим состояния, потому что режим состояния создаст много Подклассы.
Пожалуйста, смотрите следующий пример:
Кода -копия выглядит следующим образом:
контекст публичного класса {
Частное цветовое состояние = NULL;
public void push () {
// Если текущее красное состояние переключается на синий
if (state == color.red) state = color.blue;
// Если текущее синее состояние переключается на зеленый
иначе if (state == color.blue) state = color.green;
// Если текущее черное состояние переключается на красный
иначе if (state == color.black) state = color.red;
// Если текущее зеленое состояние переключается на черный
иначе if (state == color.green) state = color.black;
Образец образец = новый выборка (состояние);
sample.operate ();
}
public void pull () {
// Это именно противоположность переключению состояния push if (state == color.green) state = color.blue;
иначе if (state == color.black) state = color.green;
иначе if (state == color.blue) state = color.red;
иначе if (state == color.red) state = color.black;
Образец2 Образец2 = новый образцы2 (состояние);
sample2.operate ();
}
}
В приведенном выше примере у нас есть два действия, которые нажимают и тянут.
Также обратите внимание: но в приведенном выше примере изменение состояния - это простое задание цвета. Использование.
Например: банковские счета часто переключаются между открытым состоянием и состоянием закрытия.
Например: классическая TCPConnection, состояние TCP имеет три состояния: создание закрытия слушания и повторных преобразований.
Например: учетная запись Mailbox POP будет иметь четыре состояния, начнем с авторизованного ухода HAMUSERNAME, соответствующее поведение каждого состояния должно быть относительно большим, подходящим для использования состояния.
Например: выбор различных инструментов в наборе инструментов можно рассматривать как переключение между различными инструментами, подходящим для использования состояния. Например, если у вас есть конкретная программа рисования, пользователи могут выбрать разные инструменты для рисования прямоугольной кривой.
Как использовать режим состояния
Государство требует двух типов объектов для участия:
1. Штатный менеджер Государственный менеджер - это переключатель.
2. Родительский класс, реализованный абстрактными классами или интерфейсами, разные состояния наследуют различные подклассы этого родительского класса.
Принимая приведенный выше контекст в качестве примера, мы хотим изменить его и создать два типа объектов.
Первый шаг - создать родительский класс:
Кода -копия выглядит следующим образом:
публичное абстрактное состояние класса {
Общественная абстрактная void handlepush (контекст C);
Общественная абстрактная void -ручка (контекст C);
Public Abstract void getColor ();
}
Методы в родительском классе должны соответствовать поведению переключения в менеджере штата. должен быть обработан специально.
Ниже приведены реализации конкретных подклассов:
Кода -копия выглядит следующим образом:
Public Class Bluestate расширяет состояние {
public void handlepush (контекст C) {
// Согласно методу push «Если он синий, переключитесь на зеленый»;
C.SetState (New Greenstate ());
}
public void handlepull (контекст C) {
// в соответствии с методом тяги «Если он синий, переключитесь на красный»;
C.SetState (New RedState ());
}
Public Abstract void getColor () {return (color.blue)}
}
Точно так же подклассы в других штатах реализованы как синие.
Второй шаг - переписать управляющего государством, который является контекстом этого примера:
Кода -копия выглядит следующим образом:
Ublic Class Context {
Частное государство = null;
// SetState используется для изменения состояния состояния с использованием SetState для достижения переключения состояний
Pulic void setstate (состояние состояния) {
this.state = состояние;
}
public void push () {
// Подробная информация о переключении состояния в этом случае изменение цвета, которое было инкапсулировано в ручку подкласса, и нет необходимости заботиться о состоянии. Handlepush (это);
// Поскольку выборка необходимо использовать результат переключения в состояние, используйте getColor ()
Образец образец = новый выборка (state.getColor ());
sample.operate ();
}
public void pull () {
state.handlepull (это);
Sample2 Sample2 = New Sample2 (state.getColor ());
sample2.operate ();
}
}
На этом этапе мы внедрили процесс рефакторирования состояния.
Приведенное выше является просто простой пример.