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

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

Призначення

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

Мотивація

Застосовність

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

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

Структура

UML діаграма, що описує структуру шаблону проектування Стан

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

Відносини

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

 

3.9. Стратегія. Матеріал відсутній.

3.10. Знімок (шаблон проектування)

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

Призначення

Не порушуючи інкапсуляції, фіксує та виносить за межі об'єкта його внутрішній стан так, щоб пізніше можна було відновити з нього об'єкт.

Мотивація

Застосовність

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

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

Структура

UML діаграма, що описує структуру шаблону проектування Знімок

  • Memento — контекст:
    • зберігає внутрішній стан об'єкта Originator. Обсяг інформації, що зберігається, може бути різним та визначається потребами хазяїна;
    • забороняє доступ усім іншим об'єктам окрім хазяїна. По суті знімок має два інтерфейси. Опікун Caretaker користується лише вузьким інтерфейсом знімку — він може лише передавати знімок іншим об'єктам. Напроти, хазяїн користується широким інтерфейсом, котрий забезпечує доступ до всіх даних, необхідних для відтворення об'єкта (чи його частини) у попередньому стані. Ідеальний варіант — коли тільки хазяїну, що створив знімок, відкритий доступ до внутрішнього стану знімку;
  • Originator — хазяїн:
    • створює знімок, що утримує поточний внутрішній стан;
    • використовує знімок для відтворення внутрішнього стану;
  • CareTaker — опікун:
    • відповідає за зберігання знімку;
    • не проводить жодних операцій над знімком та не має уяви про його внутрішній зміст.

Відносини

  • опікун запитує знімок у хазяїна, деякий час тримає його у себе, опісля повертає хазяїну. Іноді цього не відбувається, бо хазяїн не має необхідності відтворювати свій попередній стан;

UML діаграма, що описує відносини між об'єктами шаблону проектування Знімок

  • знімки пасивні. Тільки хазяїн, що створив знімок, має доступ до інформації про стан.