Материал: ответы на паттерны экзамен

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Название

Адаптер (Adapter)

Тип

Структурный

Назначение

Преобразует существующий интерфейс класса в другой интерфейс, который понятен клиентам. Позволяет объектам с несовместимыми интерфейсами работать вместе.

Преимущества

Отделяет и скрывает от клиента подробности преобразования различных интерфейсов.

Недостатки

Усложняет код программы из-за введения дополнительных классов.

Реализация

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

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

Схема

Название

Декоратор (Decorator)

Тип

Структурный

Назначение

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

Преимущества

  • Большая гибкость, чем у наследования.

  • Позволяет добавлять обязанности на лету.

  • Можно добавлять несколько новых обязанностей сразу.

  • Позволяет иметь несколько мелких объектов вместо одного.

Недостатки

  • Трудно конфигурировать многократно обёрнутые объекты.

  • Большое количество мелких классов.

Реализация

Когда вам нужно добавлять обязанности объектам на лету, незаметно для кода, который их использует.

Когда нельзя расширить обязанности объекта с помощью наследования.

Схема

Название

Заместитель (Proxy)

Тип

Структурный

Назначение

Подменяет выбранный объект другим объектом для управления контроля доступа к исходному объекту.

Преимущества

  • Позволяет контролировать сервисный объект незаметно для клиента.

  • Может работать, даже если сервисный объект ещё не создан.

  • Может контролировать жизненный цикл служебного объекта.

Недостатки

  • Усложняет код программы из-за введения дополнительных классов.

  • Увеличивает время отклика от сервиса.

Реализация

Защита доступа (защищающий прокси). Когда в программе есть разные типы пользователей, и вам хочется защищать объект от неавторизованного доступа. Например, если ваши объекты — это важная часть операционной системы, а пользователи — сторонние программы (хорошие или вредоносные).

Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.

Схема

Название

Компоновщик (Composite)

Тип

Структурный

Назначение

Группирует объекты в иерархические структуры для представления отношений типа «часть-целое», что позволяет клиенту работать с единичными объектами так же, как с группами объектов.

Преимущества

  • Упрощает архитектуру клиента при работе со сложным деревом компонентов.

  •  Облегчает добавление новых видов компонентов.

Недостатки

Создаёт слишком общий дизайн классов.

Реализация

Когда вам нужно представить древовидную структуру объектов.

Схема

Название

Мост (Bridge)

Тип

Структурный

Назначение

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

Преимущества

Позволяет строить платформо-независимые программы.

Скрывает лишние или опасные детали реализации от клиентского кода.

Реализует принцип открытости/закрытости.

Недостатки

Усложняет код программы из-за введения дополнительных классов.

Реализация

Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы.

Когда вы хотите разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности (например, если класс может работать с разными системами баз данных).

Схема

Название

Приспособленец (Flyweight)

Тип

Структурный

Назначение

Использует принцип разделения для эффективной поддержки большого числа мелких объектов.

Преимущества

Экономит оперативную память.

Недостатки

Расходует процессорное время на поиск/вычисление контекста.

Усложняет код программы из-за введения множества дополнительных классов.

Реализация

Когда не хватает оперативной памяти для поддержки всех нужных объектов.

Схема

Название

Фасад (Facade)

Тип

Структурный

Назначение

Предоставляет единый интерфейс к множеству операций или интерфейсов в системе на основе унифицированного интерфейса для облегчения работы с системой.

Преимущества

Изолирует клиентов от компонентов сложной подсистемы.

Недостатки

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

Реализация

Когда вам нужно представить простой или урезанный интерфейс к сложной подсистеме.

Схема

Поведенческий тип.

Название

Итератор (Iterator)

Тип

Поведенческий

Назначение

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

Преимущества

Упрощает классы хранения данных.

Позволяет реализовать различные способы обхода структуры данных.

Позволяет одновременно перемещаться по структуре данных в разные стороны.

Недостатки

Не оправдан, если можно обойтись простым циклом.

Реализация

Когда у вас есть сложная структура данных, и вы хотите скрыть от клиента детали её реализации (из-за сложности или вопросов безопасности).

Когда вам нужно иметь несколько вариантов обхода одной и той же структуры данных.

Схема

Название

Команда (Command)

Тип

Поведенческий

Назначение

Инкапсулирует запрос в виде объекта, обеспечивая параметризацию клиентов типом запроса, установление очередности запросов, протоколирование запросов и отмену выполнения операций.

Преимущества

  • Убирает прямую зависимость между объектами, вызывающими операции, и объектами, которые их непосредственно выполняют.

  • Позволяет реализовать простую отмену и повтор операций.

  • Позволяет реализовать отложенный запуск операций.

  • Позволяет собирать сложные команды из простых.

Недостатки

Усложняет код программы из-за введения множества дополнительных классов.

Реализация

Когда вы хотите ставить операции в очередь, выполнять их по расписанию или передавать по сети.

Когда вы хотите параметризовать объекты выполняемым действием.

Схема

Название

Наблюдатель (Observer)

Тип

Поведенческий

Назначение

Специфицирует зависимость типа «один ко многим» между различными объектами, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются.

Преимущества

  • Издатели не зависят от конкретных классов подписчиков и наоборот.

  •  Вы можете подписывать и отписывать получателей на лету.

Недостатки

Подписчики оповещаются в случайном порядке.

Реализация

Когда после изменения состояния одного объекта требуется что-то сделать в других, но вы не знаете наперёд, какие именно объекты должны отреагировать.

Схема

Название

Посетитель (Visitor)

Тип

Поведенческий

Назначение

Позволяет определить новую операцию, не меняя описаний классов, у объектов которых она вызывается.

Преимущества

  • Упрощает добавление операций, работающих со сложными структурами объектов.

  • Объединяет родственные операции в одном классе.

  • Посетитель может накапливать состояние при обходе структуры элементов.

Недостатки

  • Паттерн не оправдан, если иерархия элементов часто меняется.

  • Может привести к нарушению инкапсуляции элементов.

Реализация

Когда вам нужно выполнить какую-то операцию над всеми элементами сложной структуры объектов, например, деревом.

Когда новое поведение имеет смысл только для некоторых классов из существующей иерархии.

Схема

Название

Посредник (Mediator)

Тип

Поведенческий

Назначение

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

Преимущества

  • Устраняет зависимости между компонентами, позволяя повторно их использовать.

  • Упрощает взаимодействие между компонентами.

Централизует управление в одном месте.

Недостатки

Посредник может содержать множество полей/методов/строк кода.

Реализация

Когда вам сложно менять некоторые классы из-за того, что они имеют множество хаотичных связей с другими классами.

Когда вам приходится создавать множество подклассов компонентов, чтобы использовать одни и те же компоненты в разных контекстах.

Схема

Название

Состояние (State)

Тип

Поведенческий

Назначение

Позволяет выбранному объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что изменился класс объекта.

Преимущества

  • Избавляет от множества больших условных операторов машины состояний.

  •  Концентрирует в одном месте код, связанный с определённым состоянием.

  •  Упрощает код контекста.

Недостатки

Может неоправданно усложнить код, если состояний мало, и они редко меняются.

Реализация

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

Когда у вас есть объект, поведение которого кардинально меняется в зависимости от внутреннего состояния, причём типов состояний много, и их код часто меняется.

Схема

Название

Стратегия (Strategy)

Тип

Поведенческий

Назначение

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

Преимущества

  • Горячая замена алгоритмов на лету.

  •  Изолирует код и данные алгоритмов от остальных классов.

  •  Уход от наследования к делегированию.

Недостатки

  • Усложняет программу за счёт дополнительных классов.

  •  Клиент должен знать, в чём состоит разница между стратегиями, чтобы выбрать подходящую.

Реализация

Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта.

Когда у вас есть множество похожих классов, отличающихся только некоторым поведением.

Схема

Название

Хранитель (Memento)

Тип

Поведенческий

Назначение

Дает возможность получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии, не нарушая принципа инкапсуляции.

Преимущества

  • Не нарушает инкапсуляции исходного объекта.

  •  Упрощает структуру исходного объекта. Ему не нужно хранить историю версий своего состояния.

Недостатки

  • Требует много памяти, если клиенты слишком часто создают снимки.

  •  Может повлечь дополнительные издержки памяти, если объекты, хранящие историю, не освобождают ресурсы, занятые устаревшими снимками.

Реализация

Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию.

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

Схема

Источник: https://studfile.net/preview/16584794/