10 (1158689), страница 2
Текст из файла (страница 2)
Классификация: образец поведения.
Назначение: дать последовательный доступ к набору однородных объектов, не раскрывая его внутреннего представления.
Ситуация применимости: есть структура данных, для которой нужно реализовать один или несколько способов обхода – каждый осуществляется отдельным итератором.
Участники:
-
Iterator – общий интерфейс для доступа и обхода структуры данных;
-
ConcreteIterator –
-
конкретный способ обхода;
-
помнит позицию курсора (текущий элемент);
-
Aggregate – интерфейс для создания итератора;
ConcreteAggregate – реализация интерфейса Aggregate.
Результаты:
-
поддерживаются разные способы обхода;
-
упрощается интерфейс Aggregate;
-
есть возможность иметь одновременно несколько активных обходов (столько, сколько объектов-итераторов).
Strategy (Стратегия)
Классификация: образец поведения.
Назначение: Определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми.
Мотивация: есть несколько алгоритмов решения одной задачи, которые нежелательно «зашивать» в клиентский класс.
Ситуации применимости:
-
Имеется много родственных классов, отличающихся только поведением.
-
Необходимо иметь несколько разных реализаций одной операции.
-
Нужно скрыть от клиента сложные, специфичные для алгоритма структуры данных.
-
Упрощение кода метода, представляющего собой длинное ветвление или switch.
Участники:
-
Strategy – интерфейс общий для семейства алгоритмов;
-
ConcreteStrategy – конкретная стратегия, реализующая интерфейс;
-
Context – контекст, направляющий запросы клиента стратегиям;
-
Client – клиентский класс.
Результаты:
-
Иерархия классов стратегий определяет семейство алгоритмов или поведений, которые можно повторно использовать.
-
Инкапсуляция алгоритма в отдельный класс позволяет изменять его независимо от контекста.
-
Избавляемся от if и switch (улучшаем читаемость кода).
-
Интерфейс класса Strategy общий для всех подклассов ConcreteStrategy – неважно, сложна или тривиальна их реализация. Поэтому вполне вероятно, что некоторые стратегии не будут пользоваться всей передаваемой им информацией, особенно простые.
Decorator (Декоратор)
Классификация: структурный образец.
Назначение: добавление объекту новых обязанностей в динамике. Альтернатива подклассам.
Мотивация: Например, хотим, чтобы библиотека GUI могла добавлять свойства (рамку) или новое поведение (прокрутку) к любому элементу GUI. Для этого «оборачиваем» элемент GUI в объект-декоратор. Декоратор имеет тот же интерфейс. Он переадресует запросы элементу, который в него «завернут».
Ситуации применимости:
-
для динамического, прозрачного для клиентов добавления обязанностей объектам;
-
для реализации обязанностей, которые могут быть сняты с объекта;
-
когда расширение путем порождения подклассов по каким-то причинам неудобно или невозможно.
Участники:
-
Component – интерфейс для декорируемых объектов;
-
ConcreteComponent – класс декорируемых объектов;
-
Decorator – декоратор, ссылающийся на декорируемый объект и определяющий интерфейс для декораторов, соответствующий интерфейсу Component;
-
ConcreteDecorator – реализует какое-либо дополнительное поведение;
-
Client – клиентский класс.
Результаты:
-
Позволяет гибко добавлять объекту новые обязанности. Обязанности могут быть добавлены или удалены во время выполнения программы. Применение нескольких декораторов обеспечивает сочетание добавляемых обязанностей.
-
Хотя декорированный объект и обычный имеют общий интерфейс, они различны.
-
Получаемая система состоит из множества мелких объектов, которые похожи друг на друга.
6