Лабораторная работа № 2
Использование структурных шаблонов проектирования
Цель работы
Изучить шаблоны проектирования, относящиеся к классу структурных,
освоить применение шаблонов этого класса при разработке программных систем с применением объектно-ориентированных языков программирования.
Теоретические сведения
В структурных (structural) паттернах рассматривается вопрос о том, как из классов и объектов образуются более крупные структуры. Структурные паттерны уровня класса используют наследование для составления композиций из интерфейсов и реализаций.
Простой пример – использование множественного наследования для объединения нескольких классов в один. В результате получается класс,
обладающий свойствами всех своих родителей. Особенно полезен этот паттерн,
когда нужно организовать совместную работу нескольких независимо разработанных библиотек.
Другой пример паттерна уровня класса – «адаптер». В общем случае адаптер делает интерфейс одного класса (адаптируемого) совместимым с интерфейсом другого, обеспечивая тем самым унифицированную абстракцию разнородных интерфейсов. Это достигается за счет закрытого наследования адаптируемому классу. После этого адаптер выражает свой интерфейс в терминах операций адаптируемого класса.
Вместо композиции интерфейсов или реализаций структурные паттерны уровня объекта компонуют объекты для получения новой функциональности.
Дополнительная гибкость в этом случае связана с возможностью изменить композицию объектов во время выполнения, что недопустимо для статической композиции классов.
10
Примером структурного паттерна уровня объектов является
«компоновщик». Он описывает построение иерархии классов для двух видов объектов: примитивных и составных. Последние позволяют создавать произвольно сложные структуры из примитивных и других составных объектов.
Впаттерне «заместитель» объект берет на себя функции другого объекта.
Узаместителя есть много применений. Он может действовать как локальный представитель объекта, находящегося в удаленном адресном пространстве. Или представлять большой объект, загружаемый по требованию. Или ограничивать доступ к критически важному объекту. Заместитель вводит дополнительный косвенный уровень доступа к отдельным свойствам объекта. Поэтому он может ограничивать, расширять или изменять эти свойства.
Паттерн «приспособленец» определяет структуру для совместного использования объектов. Владельцы разделяют объекты, по меньшей мере, по двум причинам: для достижения эффективности и непротиворечивости.
Приспособленец акцентирует внимание на эффективности использования памяти. В приложениях, в которых участвует очень много объектов, должны снижаться накладные расходы на хранение. Значительной экономии можно добиться за счет разделения объектов вместо их дублирования. Но объект может быть разделяемым, только если его состояние не зависит от контекста. У
объектов-приспособленцев такой зависимости нет. Любая дополнительная информация передается им по мере необходимости. В отсутствие контекстных зависимостей объекты-приспособленцы могут легко разделяться.
Если паттерн «приспособленец» дает способ работы с большим числом мелких объектов, то «фасад» показывает, как один объект может представлять целую подсистему. Фасад представляет набор объектов и выполняет свои функции, перенаправляя сообщения объектам, которых он представляет.
Паттерн «мост» отделяет абстракцию объекта от его реализации, так что их можно изменять независимо.
11
Паттерн «декоратор» описывает динамическое добавление объектам новых обязанностей. Это структурный паттерн, который рекурсивно компонует объекты с целью реализации заранее неизвестного числа дополнительных функций. Например, объект-декоратор, содержащий некоторый элемент пользовательского интерфейса, может добавить к нему оформление в виде рамки или тени либо новую функциональность, например возможность прокрутки или изменения масштаба. Два разных оформления прибавляются путем простого вкладывания одного декоратора в другой. Для достижения этой цели каждый объект-декоратор должен соблюдать интерфейс своего компонента и перенаправлять ему сообщения. Свои функции (скажем,
рисование рамки вокруг компонента) декоратор может выполнять как до, так и после перенаправления сообщения.
Многие структурные паттерны в той или иной мере связаны друг с другом.
Таким образом, к структурным шаблонам относятся:
адаптер (adapter / wrapper);
мост (bridge);
компоновщик (composite);
декоратор (decorator);
фасад (facade);
приспособленец (flyweight);
заместитель (proxy).
Задание
Реализовать программу для решения задачи согласно варианту с использованием требуемого структурного шаблона проектирования.
Содержание отчета
1. Титульный лист.
12
2.Цель работы, задание, вариант.
3.Краткие теоретические сведения.
3.1.Описание шаблона проектирования.
3.2.Классовая диаграмма для шаблона проектирования в нотации
UML.
4.Описание условий и хода работы.
4.1.Используемые аппаратные и программные средства.
4.2.Интерпретация шаблона проектирования для решения задачи.
4.3.Классовая диаграмма для задачи в нотации UML.
5.Результаты работы.
5.1.Текст программы (только классы, реализующие шаблон проектирования и клиентский код, использующий шаблон).
6.Анализ результатов работы.
(Скриншоты с результатами выполнения программы, содержание базы данных, файлов – в зависимости от варианта).
7.Выводы о достоинствах и недостатках используемого шаблона проектирования.
Контрольные вопросы
1.Назначение структурных шаблонов проектирования. Перечень структурных шаблонов.
2.Назначение и структура шаблона «адаптер» (adapter / wrapper).
Преимущества и недостатки шаблона.
3.Назначение и структура шаблона «мост» (bridge). Преимущества и недостатки шаблона.
4.Назначение и структура шаблона «компоновщик» (composite).
Преимущества и недостатки шаблона.
5.Назначение и структура шаблона «декоратор» (decorator).
Преимущества и недостатки шаблона.
13
6.Назначение и структура шаблона «фасад» (facade). Преимущества и недостатки шаблона.
7.Назначение и структура шаблона «приспособленец» (flyweight).
Преимущества и недостатки шаблона.
8.Назначение и структура шаблона «заместитель» (proxy).
Преимущества и недостатки шаблона.
Варианты
1.Декоратор.
1.1.На базе класса .NET Framework System.IO.FileStream реализовать набор классов, реализующих следующие преобразования двоичных данных с сохранением в файл:
1)кодирование в формате Base64;
2)шифрование криптографическим алгоритмом (любым).
Тестовое приложение должно обладать функциями записи в файл двоичных данных с использованием любой комбинации преобразований в любой последовательности и чтения данных из файла с обратным преобразованием.
1.2.На базе классов .NET Framework System.IO.StreamWriter, StreamReader
реализовать набор классов, реализующих следующие преобразования текстовых данных с сохранением в файл:
1)перевод по словам с использованием Google Translate API;
2)шифрование методом перестановки слов по заданной схеме.
Тестовое приложение должно обладать функциями записи в файл текстовых данных с использованием любой комбинации преобразований в любой последовательности и чтения данных из файла с обратным преобразованием.
1.3.На базе классов .NET Framework System.IO.StreamWriter, StreamReader
реализовать набор классов, реализующих следующие преобразования
текстовых данных с сохранением в файл:
14