Стан (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Стан (англ. State) — шаблон проектування, відноситься до класу шаблонів поведінки.

Призначення[ред.ред. код]

Дозволяє об'єктові варіювати свою поведінку залежно від внутрішнього стану.

Мотивація[ред.ред. код]

Застосовність[ред.ред. код]

Слід використовувати шаблон Стан у випадках, коли:

  • поведінка об'єкта залежить від його стану та повинна змінюватись під час виконання програми;
  • у коді операцій зустрічаються складні умовні оператори, у котрих вибір гілки залежить від стану. Зазвичай у такому разі стан представлено константами, що перелічуються. До того ж часто одна й та ж структура умовного оператору повторюється у декількох операціях. Шаблон Стан пропонує замінити кожну гілку окремим класом. Це дозволить трактувати стан об'єкта як самостійний об'єкт, котрий може змінитися незалежно від інших.

Структура[ред.ред. код]

UML діаграма, що описує структуру шаблону проектування Стан
  • Context — контекст:
    • визначає інтерфейс, що є корисним для клієнтів;
    • зберігає екземпляр підкласу ConcreteState, котрим визначається поточний стан;
  • State — стан:
    • визначає інтерфейс для інкапсуляції поведінки, асоційованої з конкретним станом контексту Context;
  • Підкласи ConcreteState — конкретні стани:
    • кожний підклас реалізує поведінку, асоційовану з деяким станом контексту Context.

Відносини[ред.ред. код]

  • клас Context делегує залежні від стану запити до поточного об'єкта ConcreteState;
  • контекст може передати себе у якості аргументу об'єкта State, котрий буде обробляти запит. Це надає можливість об'єкта-стану при необхідності отримати доступ до контексту;
  • Context — це головний інтерфейс для клієнтів. Клієнти можуть конфігурувати контекст об'єктами стану State. Один раз cконфігурувавши контекст, клієнти вже не повинні напряму зв'язуватися з об'єктами стану;
  • або Context, або підкласи ConcreteState можуть вирішити, за яких умов та у якій послідовності відбувається зміна станів.

Реалізація[ред.ред. код]

Приклад Java[ред.ред. код]

class Car {
    private CarState carState;
 
    public Car() {
        off();	
    }	
    public void on() {
        carState = new CarOn();	
        System.out.println("The car is on!");
    }
    public void off() {
        carState = new CarOff();
        System.out.println("The car is off!");	
    }
    public void start() {
        carState = new CarMoving();
        System.out.println("The car is moving!");
    }
 
    public void openWindow() {
        carState.openWindow();
    }	 
    public void openDoor() {
        carState.openDoor();
    }
}
 
abstract class CarState {
    abstract public void openWindow();
    abstract public void openDoor();
}
 
class CarOff extends CarState {
    public void openWindow() {
        System.out.println("Can't open the window! Switch the car on!");
    }
    public void openDoor() {
        System.out.println("The door is being opened ...");			
    }
}
 
class CarOn extends CarState {
    public void openWindow() {
        System.out.println("The window is being opened ...");
    }
    public void openDoor() {
        System.out.println("The door is being opened ...");			
    }
}
 
class CarMoving extends CarState {
    public void openWindow() {
        System.out.println("The window is being opened ...");
    }
    public void openDoor() {
        System.out.println("Can't open the door while moving!");			
    }
}
 
class Main {
    public static void main(String[] args) {
        Car car = new Car();
        car.openWindow();
        car.openDoor();
        car.on();
        car.openWindow();
        car.openDoor();
        car.start();
        car.openWindow();
        car.openDoor();			
    }
}

Джерела[ред.ред. код]

Література[ред.ред. код]

Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5.