Добавил:
rushevamar@mail.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ответы на паттерны экзамен

.doc
Скачиваний:
79
Добавлен:
31.05.2022
Размер:
516.61 Кб
Скачать

Название

Адаптер (Adapter)

Тип

Структурный

Назначение

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

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

Тип

Структурный

Назначение

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

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

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

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

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

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

Недостатки

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

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

Реализация

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

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

Схема

Название

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

Тип

Структурный

Назначение

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

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

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

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

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

Недостатки

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

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

Реализация

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

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

Схема

Название

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

Тип

Структурный

Назначение

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

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

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

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

Недостатки

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

Реализация

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

Схема

Название

Мост (Bridge)

Тип

Структурный

Назначение

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

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

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

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

Тип

Структурный

Назначение

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

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

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

Недостатки

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

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

Реализация

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

Схема

Название

Фасад (Facade)

Тип

Структурный

Назначение

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

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

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

Недостатки

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

Реализация

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

Схема

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

Название

Итератор (Iterator)

Тип

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

Назначение

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

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

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

Команда (Command)

Тип

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

Назначение

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

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

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

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

Недостатки

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

Реализация

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

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

Недостатки

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

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

Реализация

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

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

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

Недостатки

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

Реализация

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

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

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

Недостатки

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

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

Реализация

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

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

Схема

Название

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

Тип

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

Назначение

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

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

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

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

Недостатки

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

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

Реализация

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

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

Схема

Название

Цепочка обязанностей (Chain of Responsibility)

Тип

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

Назначение

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

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

Уменьшает зависимость между клиентом и обработчиками.

Недостатки

Запрос может остаться никем не обработанным.

Реализация

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

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

Схема

Название

Шаблонный метод (Template Method)

Тип

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

Назначение

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

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

Облегчает повторное использование кода.

Недостатки

Вы жёстко ограничены скелетом существующего алгоритма.

С ростом количества шагов шаблонный метод становится слишком сложно поддерживать.

Реализация

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

Схема

Порождающий тип.

Название

Абстрактная фабрика (Abstract Factory)

Тип

Порождающий

Назначение

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

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

  • Гарантирует сочетаемость создаваемых продуктов.

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

  • Выделяет код производства продуктов в одно место, упрощая поддержку кода.

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

Недостатки

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

  • Требует наличия всех типов продуктов в каждой вариации.

Реализация

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

Схема

Название

Одиночка (Singleton)

Тип

Порождающий

Назначение

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

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

  • Гарантирует наличие единственного экземпляра класса.

  • Предоставляет к нему глобальную точку доступа.

  • Реализует отложенную инициализацию объекта-одиночки.

Недостатки

  • Нарушает принцип единственной ответственности класса.

  • Маскирует плохой дизайн.

  • Проблемы мультипоточности.

Реализация

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

Схема

Название

Прототип (Prototype)

Тип

Порождающий

Назначение

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

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

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

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

  •  Ускоряет создание объектов.

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

Недостатки

Сложно клонировать составные объекты, имеющие ссылки на другие объекты.

Реализация

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

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

Схема