Стан (шаблон проектування)
Стан (англ. 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 діаграма, що описує відносини між об'єктами шаблону проектування Знімок
- знімки пасивні. Тільки хазяїн, що створив знімок, має доступ до інформації про стан.