ответы на паттерны экзамен
.docНазвание |
Адаптер (Adapter) |
Тип |
Структурный |
Назначение |
Преобразует существующий интерфейс класса в другой интерфейс, который понятен клиентам. Позволяет объектам с несовместимыми интерфейсами работать вместе. |
Преимущества |
Отделяет и скрывает от клиента подробности преобразования различных интерфейсов. |
Недостатки |
Усложняет код программы из-за введения дополнительных классов. |
Реализация |
Когда вы хотите использовать сторонний класс, но его интерфейс не соответствует остальному коду приложения. Когда вам нужно использовать несколько существующих подклассов, но в них не хватает какой-то общей функциональности, причём расширить суперкласс вы не можете. |
Схема |
|
Название |
Декоратор (Decorator) |
Тип |
Структурный |
Назначение |
Применяется для расширения имеющейся функциональности и является альтернативой порождению подклассов на основе динамического назначения объектам новых операций |
Преимущества |
|
Недостатки |
|
Реализация |
Когда вам нужно добавлять обязанности объектам на лету, незаметно для кода, который их использует. Когда нельзя расширить обязанности объекта с помощью наследования. |
Схема |
|
Название |
Заместитель (Proxy) |
Тип |
Структурный |
Назначение |
Подменяет выбранный объект другим объектом для управления контроля доступа к исходному объекту. |
Преимущества |
|
Недостатки |
|
Реализация |
Защита доступа (защищающий прокси). Когда в программе есть разные типы пользователей, и вам хочется защищать объект от неавторизованного доступа. Например, если ваши объекты — это важная часть операционной системы, а пользователи — сторонние программы (хорошие или вредоносные). Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере. |
Схема |
|
Название |
Компоновщик (Composite) |
Тип |
Структурный |
Назначение |
Группирует объекты в иерархические структуры для представления отношений типа «часть-целое», что позволяет клиенту работать с единичными объектами так же, как с группами объектов. |
Преимущества |
|
Недостатки |
Создаёт слишком общий дизайн классов. |
Реализация |
Когда вам нужно представить древовидную структуру объектов.
|
Схема |
|
Название |
Мост (Bridge) |
Тип |
Структурный |
Назначение |
Отделяет абстракцию класса от его реализации, благодаря чему появляется возможность независимо изменять то и другое. |
Преимущества |
Позволяет строить платформо-независимые программы. Скрывает лишние или опасные детали реализации от клиентского кода. Реализует принцип открытости/закрытости. |
Недостатки |
Усложняет код программы из-за введения дополнительных классов. |
Реализация |
Когда вы хотите, чтобы реализацию можно было бы изменять во время выполнения программы. Когда вы хотите разделить монолитный класс, который содержит несколько различных реализаций какой-то функциональности (например, если класс может работать с разными системами баз данных). |
Схема |
|
Название |
Приспособленец (Flyweight) |
Тип |
Структурный |
Назначение |
Использует принцип разделения для эффективной поддержки большого числа мелких объектов. |
Преимущества |
Экономит оперативную память. |
Недостатки |
Расходует процессорное время на поиск/вычисление контекста. Усложняет код программы из-за введения множества дополнительных классов. |
Реализация |
Когда не хватает оперативной памяти для поддержки всех нужных объектов. |
Схема |
|
Название |
Фасад (Facade) |
Тип |
Структурный |
Назначение |
Предоставляет единый интерфейс к множеству операций или интерфейсов в системе на основе унифицированного интерфейса для облегчения работы с системой. |
Преимущества |
Изолирует клиентов от компонентов сложной подсистемы. |
Недостатки |
Может стать объектом, привязанным ко всем классам программы, в котором будет храниться слишком много информации. |
Реализация |
Когда вам нужно представить простой или урезанный интерфейс к сложной подсистеме. |
Схема |
|
Поведенческий тип.
Название |
Итератор (Iterator) |
Тип |
Поведенческий |
Назначение |
Дает возможность последовательно перебирать все элементы составного объекта, не раскрывая его внутреннего представления. |
Преимущества |
Упрощает классы хранения данных. Позволяет реализовать различные способы обхода структуры данных. Позволяет одновременно перемещаться по структуре данных в разные стороны. |
Недостатки |
Не оправдан, если можно обойтись простым циклом. |
Реализация |
Когда у вас есть сложная структура данных, и вы хотите скрыть от клиента детали её реализации (из-за сложности или вопросов безопасности). Когда вам нужно иметь несколько вариантов обхода одной и той же структуры данных. |
Схема |
|
Название |
Команда (Command) |
Тип |
Поведенческий |
Назначение |
Инкапсулирует запрос в виде объекта, обеспечивая параметризацию клиентов типом запроса, установление очередности запросов, протоколирование запросов и отмену выполнения операций. |
Преимущества |
|
Недостатки |
Усложняет код программы из-за введения множества дополнительных классов. |
Реализация |
Когда вы хотите ставить операции в очередь, выполнять их по расписанию или передавать по сети. Когда вы хотите параметризовать объекты выполняемым действием. |
Схема |
|
Название |
Наблюдатель (Observer) |
Тип |
Поведенческий |
Назначение |
Специфицирует зависимость типа «один ко многим» между различными объектами, так что при изменении состояния одного объекта все зависящие от него получают извещение и автоматически обновляются. |
Преимущества |
|
Недостатки |
Подписчики оповещаются в случайном порядке. |
Реализация |
Когда после изменения состояния одного объекта требуется что-то сделать в других, но вы не знаете наперёд, какие именно объекты должны отреагировать. |
Схема |
|
Название |
Посетитель (Visitor) |
Тип |
Поведенческий |
Назначение |
Позволяет определить новую операцию, не меняя описаний классов, у объектов которых она вызывается. |
Преимущества |
|
Недостатки |
|
Реализация |
Когда вам нужно выполнить какую-то операцию над всеми элементами сложной структуры объектов, например, деревом. Когда новое поведение имеет смысл только для некоторых классов из существующей иерархии. |
Схема |
|
Название |
Посредник (Mediator) |
Тип |
Поведенческий |
Назначение |
Определяет объект, в котором инкапсулировано знание о том, как взаимодействуют объекты из некоторого множества. Способствует уменьшению числа связей между объектами, позволяя им работать без явных ссылок друг на друга и независимо изменять схему взаимодействия. |
Преимущества |
Централизует управление в одном месте. |
Недостатки |
Посредник может содержать множество полей/методов/строк кода. |
Реализация |
Когда вам сложно менять некоторые классы из-за того, что они имеют множество хаотичных связей с другими классами. Когда вам приходится создавать множество подклассов компонентов, чтобы использовать одни и те же компоненты в разных контекстах. |
Схема |
|
Название |
Состояние (State) |
Тип |
Поведенческий |
Назначение |
Позволяет выбранному объекту варьировать свое поведение при изменении внутреннего состояния. При этом создается впечатление, что изменился класс объекта. |
Преимущества |
|
Недостатки |
Может неоправданно усложнить код, если состояний мало, и они редко меняются. |
Реализация |
Когда код класса содержит множество больших, похожих друг на друга, условных операторов, которые выбирают поведения в зависимости от текущих значений полей класса. Когда у вас есть объект, поведение которого кардинально меняется в зависимости от внутреннего состояния, причём типов состояний много, и их код часто меняется. |
Схема |
|
Название |
Стратегия (Strategy) |
Тип |
Поведенческий |
Назначение |
Определяет множество алгоритмов, инкапсулируя их все и позволяя подставлять один вместо другого. При этом можно изменять алгоритм независимо от клиента, который им пользуется. |
Преимущества |
|
Недостатки |
|
Реализация |
Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта. Когда у вас есть множество похожих классов, отличающихся только некоторым поведением. |
Схема |
|
Название |
Хранитель (Memento) |
Тип |
Поведенческий |
Назначение |
Дает возможность получить и сохранить во внешней памяти внутреннее состояние объекта, чтобы позже объект можно было восстановить точно в таком же состоянии, не нарушая принципа инкапсуляции. |
Преимущества |
|
Недостатки |
|
Реализация |
Когда прямое получение состояния объекта раскрывает приватные детали его реализации, нарушая инкапсуляцию. Когда вам нужно сохранять мгновенные снимки состояния объекта (или его части), чтобы впоследствии объект можно было восстановить в том же состоянии. |
Схема |
|
Название |
Цепочка обязанностей (Chain of Responsibility) |
Тип |
Поведенческий |
Назначение |
Позволяет избежать жесткой зависимости отправителя запроса от его получателя, при этом объекты-получатели связываются в цепочку, а запрос передается по цепочке, пока какой-то объект его не обработает. |
Преимущества |
Уменьшает зависимость между клиентом и обработчиками. |
Недостатки |
Запрос может остаться никем не обработанным. |
Реализация |
Когда программа должна обрабатывать разнообразные запросы несколькими способами, но заранее неизвестно, какие конкретно запросы будут приходить, и какие обработчики для них понадобятся. Когда набор объектов, способных обработать запрос, должен задаваться динамически. |
Схема |
|
Название |
Шаблонный метод (Template Method) |
Тип |
Поведенческий |
Назначение |
Определяет структуру алгоритма, перераспределяя ответственность за некоторые его шаги на подклассы. При этом подклассы могут переопределять шаги алгоритма, не меняя его общей структуры. |
Преимущества |
Облегчает повторное использование кода. |
Недостатки |
Вы жёстко ограничены скелетом существующего алгоритма. С ростом количества шагов шаблонный метод становится слишком сложно поддерживать. |
Реализация |
Когда у вас есть несколько классов, делающих одно и то же с незначительными отличиями. Если вы редактируете один класс, то приходится вносить такие же правки и в остальные классы. |
Схема |
|
Порождающий тип.
Название |
Абстрактная фабрика (Abstract Factory) |
Тип |
Порождающий |
Назначение |
Предоставляет интерфейс для создания множества связанных между собой или независимых объектов, конкретные классы которых неизвестны. |
Преимущества |
|
Недостатки |
|
Реализация |
Когда бизнес-логика программы должна работать с разными видами связанных друг с другом продуктов, не завися от конкретных классов продуктов. |
Схема |
|
Название |
Одиночка (Singleton) |
Тип |
Порождающий |
Назначение |
Для выбранного класса обеспечивает выполнение требования единственности экземпляра и предоставления к нему полного доступа. |
Преимущества |
|
Недостатки |
|
Реализация |
Когда в программе должен быть единственный экземпляр какого-то класса, доступный всем клиентам (например, общий доступ к базе данных из разных частей программы). |
Схема |
|
Название |
Прототип (Prototype) |
Тип |
Порождающий |
Назначение |
Описывает виды создаваемых объектов с помощью прототипа, что позволяет создавать новые объекты путем копирования этого прототипа. |
Преимущества |
|
Недостатки |
Сложно клонировать составные объекты, имеющие ссылки на другие объекты. |
Реализация |
Когда ваш код не должен зависеть от классов копируемых объектов. Когда вы имеете уйму подклассов, которые отличаются начальными значениями полей. Кто-то мог создать все эти классы, чтобы иметь возможность легко порождать объекты с определённой конфигурацией. |
Схема |
|