Проектирование, Архитектура и Конструирование Программных систем
Структурные паттерны
Структурные паттерны
Adapter
Adapter
Adapter - структура
Adapter
Adapter
Composite
Composite
Composite
Composite
Composite
Decorator
Decorator
Decorator
Decorator
Decorator
Decorator
77.30K
Category: programmingprogramming

ПАКПС 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

Результаты
(+) Большая гибкость, чем у статического наследования.
(+) Позволяет избежать перегруженных методами классов на верхних уровнях иерархии.
(-) Декоратор и его компонент, вообще говоря, не идентичны.
(-) Порождает большое число мелких объектов
English     Русский Rules