Опубликован: 12.10.2017 | Уровень: для всех | Доступ: платный
Лекция 6:

Поведенческие шаблоны проектирования

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >

Стратегия

В ситуациях, когда определенный класс содержит ряд схожих алгоритмов (способов сделать то или иное действие), как правило, эти алгоритмы приводят к одному и тому же результату, но могут отличаться по другим параметрам (время выполнения, потребление системных ресурсов и др.).В подобных ситуациях целесообразно использовать шаблон "Стратегия".

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

Для реализации данного шаблона потребуется:

  1. Определить алгоритмы, который подвержены частым изменениям.
    • Подойдёт алгоритм, имеющий несколько вариаций, которые выбираются во время выполнения программы.
  2. Создать интерфейс (стратегию), описывающий этот алгоритм.
    • Он должен быть общим для всех алгоритмов.
  3. Поместить каждый алгоритм в собственный класс.
    • Конкретная стратегия, реализующая конкретный интерфейс
  4. В контексте привязать к общему интерфейсу алгоритма, а не к конкретным классам реализациям.

Применение шаблона "Стратегия" позволяет сделать специализированные модули программного обеспечения более понятными, читаемыми и однозначными.

К основным преимуществам использования этого шаблона следует отнести следующие:

  • Оперативная замена функциональных алгоритмов, выполняющих определенную обязанность.
  • Трансформация структуры программного обеспечения в сторону делегирования определенных обязанностей.
  • Реализует принцип инкапсуляции.
  • Скрывает опасные/лишние данные.

Если провести "жизненную" аналогию по применению этого шаблона, то уместным будет следующее сравнение:

  1. Вам нужно добраться до определенного пункта.
  2. Можно доехать различным транспортом (автобус, такси, велосипед и пр.).
    • Вид транспорта – стратегия достижения конечного пункта.
  3. Вы выбираете конкретную стратегию в зависимости от контекста (наличия денег, времени и т.д.).
    • Одна стратегия может быть изменена на другую в процессе выполнения, при корректировке имеющихся ресурсов.
Шаблон "Стратегия"

Рис. 6.2.9. Шаблон "Стратегия"

Хранитель

Когда необходимо зафиксировать поведение объекта для его последующей реализации, применяется шаблон "Хранитель".

Этот шаблон применяется, если требуется зафиксировать и вынести (не нарушая структуры программы) за пределы объекта его внутреннее состояние так, чтобы впоследствии можно было восстановить в нем объект.

Таким образом, не нарушая принципа инкапсуляции, шаблон "Хранитель" получает и сохраняет за пределами объекта его внутреннее состояние так, чтобы позже можно было восстановить объект в первоначальном состоянии.

Особенно актуально применение этого паттерна в ситуации, когда нужно восстановить объект обратно в прежнее состояние.

Для реализации данного шаблона обязательно должны быть определены 3 различных "участника":

  1. Хозяин. Объект, умеющий создавать "Хранителя", а также знающий, как восстановить свое внутреннее состояние из "Хранителя".
  2. Смотритель. Объект, который знает, почему и когда "Хозяин" должен сохранять и восстанавливать себя.
  3. Хранитель. Объект, который пишется и читается "Хозяином", за которым присматривает "Смотритель".

Алгоритм выполнения шаблона "Хранитель" определяется следующим образом:

  1. "Хранитель" сохраняет внутреннее состояние объекта "Хозяин".
    • C "Хранителем" может работать только "Хозяин", который имеет доступ ко всем данным для восстановления в прежнее состояние.
    • "Хозяин" создает "Хранителя", содержащего снимок текущего внутреннего состояния, и использует его для восстановления внутреннего состояния.
  2. "Смотритель" может передавать "Хранителя" другим объектам.
  3. "Смотритель" отвечает за сохранение "Хранителя", при этом не производит никаких операций над ним и не исследует его внутреннее содержимое.
  4. "Смотритель" запрашивает "Хранителя" у "Хозяина", некоторое время держит его у себя, а затем возвращает его "Хозяину" для восстановления.
    • Не раскрывается информация, которая доступна только "Хозяину", и упрощается его структура.

Основные недостатки и издержки использования этого шаблона проектирования связаны с объемом объекта "Хозяин". Если он слишком велик, то "Хранитель" должен копировать большой объем информации. Если структура программного продукта подразумевает частое использование шаблона "Хранитель", то требуются значительные системные ресурсы для поддержки производительности программного обеспечения.

Шаблон проектирования "Хранитель" фиксирует и сохраняет за пределами объекта "Хранителя" его внутреннее состояние так, чтобы позже этот объект можно было бы восстановить в таком же состоянии.

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

Хорошей жизненной аналогией данного паттерна является коробка с паззлом, на передней части которой изображена картина в целом. Именно напоминание картины в целом –это "Хранитель" конечного состояния объекта.

< Лекция 5 || Лекция 6: 123456 || Лекция 7 >
Канагат Дюсекеев
Канагат Дюсекеев
Казахстан, Караганды, Карагандинский экономический университет, 2009
Алексей Мохов
Алексей Мохов
Россия, г. Самара