Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

6.2 Структурные шаблоны

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

К структурным шаблонам относятся: адаптер (adapter), мост (bridge), компоновщик (composite), декоратор (decorator), фасад (facade), приспособленец (flyweight), заместитель (proxy).

Шаблон "адаптер" (adapter) предназначен для преобразования интерфейса некоторого класса к ожидаемому виду, позволяющему применить данный класс в программе. Адаптер может быть использован для подключения функциональности сторонних библиотек либо для повторного использования старого кода без его переписывания.

Шаблон "мост" (bridge) позволяет отделить абстракцию (класс, определяющий интерфейс) от реализации. Мост дает возможность использовать несколько реализаций некоторого функционала − например, для разных операционных систем, и переключаться между ними без внесения изменений в программный код.

Шаблон "компоновщик" (composite) предназначен для обобщения способов работы с простыми и сложными (составными) объектами. Обобщение достигается за счет объединения объектов в древовидную структуру и передачи запросов от корневого объекта к подчиненным.

Шаблон "декоратор" (decorator) дает возможность динамически изменять функциональность объектов без необходимости создания новых подклассов, реализующих требуемые функции. Добавление декораторов (дополнительной функциональности) к объекту не требует внесения изменений в программный код.

Шаблон "фасад" (facade) позволяет организовать высокоуровневый интерфейс для множества компонентов системы. Высокоуровневый интерфейс позволяет упростить выполнение операций, затрагивающих большое количество компонентов системы.

Шаблон "приспособленец" (flyweight) позволяет применить объектно-ориентированный подход для управления множеством мелких сущностей, например, символов в строке текстового редактора. Так как символов в документе может быть много, создание отдельного объекта для каждого из них приведет к неоправданно высокому расходу памяти. Данный шаблон позволяет выделить внутреннее и внешнее состояние объекта, за счет чего уменьшается расход памяти и достигается удобство объектно-ориентированного подхода.

Шаблон "заместитель" (proxy) позволяет использовать вместо некоторого объекта его заменитель и при необходимости создать сам объект. Например, в целях оптимизации можно реализовать отложенное создание объекта, используя до этого момента его заместитель, который может выполнить часть запросов к объекту без его полной инициализации.

6.3 Шаблоны поведения

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

К шаблонам поведения относятся: цепочка обязанностей (chain of responsibility), команда (command), итератор (iterator), интерпретатор (interpretator), посредник (mediator), хранитель (memento), наблюдатель (observer), состояние (state), стратегия (strategy), шаблонный метод (template method), посетитель (visitor).

Шаблон "цепочка обязанностей" (chain of responsibility) представляет собой механизм делегирования запроса множеству обработчиков. Запрос передается последовательно всем обработчикам до тех пор, пока не найдется тот, который его обработает. Данный шаблон позволяет динамически менять обработчики и избегать жесткой связи между запросом и получателем.

Шаблон "команда" (command) инкапсулирует запросы в специальные объекты − команды. Данный шаблон может применяться для систем с фиксированным внутренним состоянием, изменяемым определенными командами. Между командами состояние системы не меняется. Примером такой системы может быть текстовый редактор, а командами − нажатие пользователем на клавиши и ввод символов. Данный шаблон позволяет легко организовать отмену и повторение действий за счет постановки объектов-команд в очередь.

Шаблон "итератор" (iterator) позволяет определить механизм перебора элементов различных коллекций, не раскрывая детали реализации. Итераторы могут быть использованы для создания алгоритмов, не зависящих от типа коллекции элементов, с которыми данные алгоритмы работают. Как правило, итераторы предоставляют следующие операции: получение элемента, на который указывает итератор, переход к следующему элементу, проверка существования следующего элемента.

Шаблон "интерпретатор" (interpreter) позволяет сформулировать решение задачи в виде последовательности команд на некотором языке. Расширение функциональности системы достигается за счет увеличения количества интерпретируемых команд. Наличие программы на интерпретируемом языке позволяет избежать изменения системы под каждую конкретную задачу.

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

Шаблон "хранитель" (memento) позволяет сохранить внутреннее состояние объекта за пределами самого объекта для последующего восстановления, при этом хранитель не раскрывает детали реализации объекта. Данный шаблон может применяться совместно с шаблоном "команда" для выполнения отмены операций.

Шаблон "наблюдатель" (observer) позволяет определить связь один-ко-многим между объектами в программе. Такая связь позволяет обеспечить передачу извещений о событиях всем заинтересованным объектам. Например, при изменении текста в редакторе происходит отображение на экране и пересчет статистики. При этом отображение и статистика реализованы в виде отдельных объектов, наблюдающих за текстовым полем редактора. Шаблон "наблюдатель" добавляет системе гибкость за счет динамического изменения связей между объектами и автоматического уведомлении о событиях.

Шаблон "состояние" (state) позволяет динамически менять поведение объекта в зависимости от его состояния. Это становится возможным за счет вынесения логики функционирования в отдельные классы-состояния. Находясь в различных состояниях, объект выполняет одни и те же операции по разному, перенаправляя запросы объекту-состоянию.

Шаблон "стратегия" (strategy) выделяет семейство схожих алгоритмов в отдельную иерархию классов. При этом алгоритмы могут заменяться динамически без перекомпиляции или перезапуска программы. Примером такой иерархии могут быть алгоритмы сохранения изображения в различных графических форматах. Новый алгоритм может быть добавлен путем создания нового класса.

Паттерн "шаблонный метод" (template method) позволяет реализовывать различные версии алгоритма за счет переопределения некоторых операций в подклассах, при этом основа алгоритма определяется в базовом классе. Например, в алгоритме сортировки основные операции будут определены в базовом классе, а в подклассе будет переопределена операция сравнения элементов. Базовый класс будет делегировать подклассу выполнение операции сравнения, вызывая для этого виртуальную функцию.

Шаблон "посетитель" (visitor) позволяет определять операции, применяемые к объектам в коллекции без внесения изменений в сами классы объектов. Класс-коллекция предоставляет механизм передачи посетителя объекту, после чего посетитель выполняет необходимую операцию. Благодаря такому подходу для добавления новой операции необходимо реализовать только новый класс − посетитель.

В следующих разделах представлены некоторые шаблоны проектирования с примерами программного кода.

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