Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Software Engineering2011.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.12 Mб
Скачать

Адаптер (adapter, wrapper)

Назначение: Преобразует интерфейс одного класса в интерфейс другого, который

ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми

интерфейсами, которая без него была бы невозможна.

Применять адаптер следует, когда Вы:

  • Хотите использовать существующий класс, но его интерфейс не соответствует вашимпотребностям;

  • Собираетесь создать повторно используемый класс, который должен взаимодействоватьс заранее неизвестными или не связанными с ним классами, имеющими несовместимыеинтерфейсы;

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

Адаптер класса использует множественное наследование для адаптации одного интерфейса кдругому. Адаптер объекта применяет композицию объектов.

Абстрактная фабрика (abstractfactory, kit)

Назначение: предоставляет интерфейс для создания семейств взаимосвязанных или

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

Используйте абстрактную фабрику, когда:

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

  • Входящие в семейство взаимосвязанные объекты должны использоваться вместе, и вамнеобходимо обеспечить выполнение этого ограничения;

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

Плюсы и минусы абстрактной фабрики:

  • Изолирует конкретные классы. Поскольку фабрика инкапсулирует ответственностьза создание классов и сам процесс их создания, то она изолирует клиента от деталейреализации классов. Клиенты манипулируют экземплярами через их абстрактныеинтерфейсы.

  • Упрощает замену семейств продуктов. Класс конкретной фабрики появляется в

приложении только один раз: при инстанцировании. Это облегчает замену используемойприложением конкретной фабрики. Приложение может изменить конфигурациюпродуктов, просто подставив новую конкретную фабрику.

  • Гарантирует сочетаемость продуктов. Если продукты некоторого семейства

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

Абстрактнаяфабрика позволяет легко соблюсти это ограничение;

Поддержать новый вид продуктов трудно. Расширение абстрактной фабрики дляизготовления новых продуктов – непростая задача. Интерфейс фиксирует наборпродуктов, которые можно создать. Для поддержки новых продуктов необходиморасширить интерфейс фабрики и изменить все подклассы.

Стратегия (strategy, policy)

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

Используйте паттерн стратегия, когда:

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

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

  • Вам нужно иметь несколько разных вариантов алгоритма. Например, можно определитьдва варианта алгоритма, один из которых требует больше времени, а другой – большепамяти;

  • В алгоритме содержатся данные, о которых клиент не должен «знать».

  • Используйте паттерн стратегия, чтобы не раскрывать сложные, специфичные для алгоритма структурыданных;

  • В классе определено много поведений, что предоставлено разветвленными условнымиоператорами. В этом случае проще перенести код из ветвей в отдельные классы стратегий.

Достоинства и недостатки паттерна стратегия:

  • Семейства родственных алгоритмов. Иерархия классов Strategy определяет семействоалгоритмов или поведений, которые можно повторно использовать в разных контекстах.

  • Наследование позволяет вычленить общую для всех алгоритмов функциональность.

  • Альтернатива порождению подклассов. Наследование поддерживает многообразие

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

различными поведениями. Но при этом поведение жестко «замешивается» в класс

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]