Similar presentations:
ПАКПС 4
1. Проектирование, Архитектура и Конструирование Программных систем
УНИВЕРСИТЕТ ДУБНАП.СЫЧЕВ
ЛЕКЦИЯ 4
2. Структурные паттерны
Структурные паттерны позволяют проектировать сложные объекты, используя несколькоболее простых. При этом могут использоваться следующие механизмы:
◦ Наследование, когда базовый класс определяет интерфейс, а подклассы - реализацию. Структуры,
на основе наследования, получаются статическими.
◦ Композиция, когда структуры строятся путем объединения объектов некоторых классов.
Композиция позволяет получать структуры, которые можно изменять во время выполнения.
3. Структурные паттерны
Паттерн Adapter представляет собой программную обертку над уже существующими классамии предназначен для преобразования их интерфейсов к виду, пригодному для последующего
использования в новом программном проекте.
Паттерн Composite группирует схожие объекты в древовидные структуры. Рассматривает
единообразно простые и сложные объекты.
Паттерн Decorator используется для расширения функциональности объектов. Являясь гибкой
альтернативой порождению классов, паттерн Decorator динамически добавляет объекту новые
обязанности.
Паттерн Proxy замещает другой объект для контроля доступа к нему.
Паттерн Facade предоставляет высокоуровневый унифицированный интерфейс к набору
интерфейсов некоторой подсистемы, что облегчает ее использование.
Паттерн Bridge отделяет абстракцию от реализации так, что то и другое можно изменять
независимо.
Паттерн Flyweight использует разделение для эффективной поддержки множества объектов.
4. Adapter
Тип: структурный.Синоним: Wrapper.
Назначение: паттерн, позволяющий преобразовать интерфейс существующего класса в
интерфейс требуемого класса.
Мотивация:
Для примера рассмотрим программу – векторный редактор. Все графические объекты в
этой программе – наследники класса Figure.
Вопрос: можно ли использовать в этой программе объекты класса, не являющегося
наследником Figure, но являющегося графическими объектами.
5. Adapter
Идея решения – создать класс –наследник Figure: LinkToFlower,
cсодержащий ссылку на экземпляр
класса Flower.
Задача класса LinkToFlower –
реализовать все методы класса
Figure, используя методы класса
Flower.
Шаблон Adapter – обобщение этого
решения.
Figure
+draw()
Rect
+draw()
Ellipse
+draw()
LinkToFlower
+draw()
flower.paint();
flower
Flower
+paint()
6. Adapter - структура
Участники:Client – класс, использующий экземпляр
класса Target (приложение)
Client
+Request()
Target – базовый (абстрактный) класс для
группы классов.
ConcreteTarget – конкретный класс,
наследник Target.
Adapter – наследник Target, содержащий
ссылку на экземпляр Adaptee.
Adaptee – адаптируемый класс.
Target
Adaptee
+SpecificReq()
ConcreteTarget
+Request()
Adapter
+adaptee
+Request()
adaptee.SpecificReq();
7. Adapter
Реализация:Сложность реализации зависит от степени удаленности адаптируемого класса Adaptee от
требуемого класса Target.
Важный случай – адаптер к семейству классов. Если, например, адаптируемый класс
Flower является наследником класса GenericFigure, являющегося базовым классом для
семейства ряда графических объектов, можно реализовать адаптер для всего семейства,
сделав его для базового класса. Возникает сложность – создание конкретного
адаптируемого объекта.
8. Adapter
Результаты:(+) повышает гибкость, позволяя использовать классы, не входящие в требуемую
иерархию.
(+) ослабляет связь между клиентом и фактически используемым классом.
9. Composite
Тип: структурный.Синоним: нет.
Назначение: компонует объекты в древовидные структуры для представления иерархий
часть-целое. Позволяет единообразно рассматривать как индивидуальные, так и
составные объекты.
Мотивация:
Для примера рассмотрим программу – векторный редактор. Все графические объекты в
этой программе – наследники класса Figure. Любой приличный редактор позволяет
группировать объекты в группы, что дает возможность манипулировать такой группой как
обычной фигурой.
10. Composite
Понятно, что нужен новый класс –наследник Figure, который будет содержать
список фигур, входящих в группу.
Figure
-x
-y
-w
-h
+Draw()
+Move()
+Resize()
+Touch()
Возникает несколько вопросов:
- Как отличить простую фигуру от составной?
- Как определить значения полей базового
класса: координаты левого верхнего угла,
ширина, высота для группы фигур?
Rect
Ellipse
Group
+Draw()
+Draw()
+Draw()
+Add()
+Clear()
figures
foreach(figure f in figures)
f.Draw();
11. Composite
СтруктураComponent – базовый класс для
семейства компонентов
+Operation1()
+Operation2()
IСomposite – интерфейс для
составных объектов
Composite – составной
компонент, содержащий список
компонентов
<<interface>>
IComposite
Component
Client
+Add(Component)
+Remove(Component)
+GetItem(int)
components
Component1
Component2
Composite
+Operation1()
+Operation2()
+Operation1()
+Operation2()
+Operation1()
+Operation2()
+Add()
+Remove()
+GetItem()
foreach (Component cmp in components)
cmp.Operation1();
12. Composite
РеализацияДля нашего примера интерфейс IGroup
мог бы выглядеть так.
Для проверки, является ли конкретный
объект сложным или простым, надо
проверить
If (fig is IGroup) …
Для более общего случая лучше сделать
обобщенный интерфейс.
interface IGroup
{
void Add(Figure f);
void Remove(Figure f);
Figure GetItem(int indx);
}
interface IGroup <T>
{
void Add(T f);
void Remove(T f);
T GetItem(int indx);
}
13. Composite
Результаты(+) позволяет построить единую иерархию классов, состоящих как из элементарных, так и
составных объектов;
(+) упрощает архитектуру клиента. Позволяет клиентской программе работать
единообразно со всеми объектами, кроме тех случаев, когда нужно различать составные и
элементарные объекты (например операция Ungroup);
(+) облегчается добавление новых компонентов.
14. Decorator
Тип: структурный.Синоним: Wrapper.
Назначение: динамически добавляет объекту новые обязанности. Является гибкой
альтернативой порождению подклассов с целью расширения обязанностей.
Мотивация:
Иногда нужно добавить новые дополнительные обязанности конкретному объекту, а не
классу в целом. Конечно, есть стандартный способ – создать подкласс, добавив в него
дополнительную функциональность.
15. Decorator
Стандартный пример – текстовый компонент в графическом редакторе. Стандартныйкомпонент позволяет поместить текст внутри компонента. Сам компонент может
перемещаться внутри картинки, можно менять шрифт, его цвет и т.п.
Дополнительная функциональность:
- хочется иметь возможность включить рамку вокруг текста, с возможностью менять ее
толщину, цвет, стиль и т.п.
- хочется иметь прокрутку (Scroll), что позволяет поместить большой текст внутри
небольшого компонента и прокручивать его содержимое.
В стандартном подходе понадобятся три наследника класса TextView: BorderTextVew,
ScrollTextView, BorderScrollTextView для текста с рамкой, с прокруткой и с рамкой вместе с
прокруткой. А если надо добавить еще одно украшение?
16. Decorator
Идея декоратора проста – мы простосоздаем класс, наследник базового с
требуемой дополнительной
функциональностью. Но основную
функциональность перекладываем на
экземпляр класса, интегрированный в
объект. Например для рамки заведем
класс BorderDecoratorTextView.
class BorderDecoratorTextView : TextView
{
TextView view;
public override void Draw()
{
// draw Border
view.Draw();
}
}
17. Decorator
СтруктураClient
Component
+Operation1()
+Operation2()
Component – базовый класс для семейства
компонентов;
1
+component
ConcreteComponent – конкретный класс
компонента;
ConcreteComponent
Decorator
+Operation1()
+Operation2()
+Operation1()
+Operation2()
1
component.Operation1();
Decorator – базовый класс для декораторов
ConcDecorator1 – декоратор с добавленной
функциональностью (методом);
ConcDecorator2 – декоратор с добавленным
состоянием.
ConcDecoratorA
+Operation1()
+Operation2()
+AddedMethod()
ConcDecoratorB
-AddedState
+Operation1()
+Operation2()
18. Decorator
РеализацияКласс Decorator использует отношение композиции. Указатель на декорируемый объект
инициализируется в конструкторе.
Класс Decorator делегирует выполнение операции декорируемому объекту.
Для реализации каждой дополнительной функциональности создайте класс, производный
от Decorator.
Подкласс Decorator реализует дополнительную функциональность и делегирует
выполнение операции базовому классу Decorator.
Клиент несет ответственность за конфигурирование системы: устанавливает типы и
последовательность использования основного объекта и декораторов.
19. Decorator
Результаты(+) Большая гибкость, чем у статического наследования.
(+) Позволяет избежать перегруженных методами классов на верхних уровнях иерархии.
(-) Декоратор и его компонент, вообще говоря, не идентичны.
(-) Порождает большое число мелких объектов
programming