94 lines
7.9 KiB
Markdown
94 lines
7.9 KiB
Markdown
# Лабораторная работа №5.
|
||
# Применение структурных паттернов.
|
||
|
||
## Задание
|
||
1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться,
|
||
какие участники там фигурируют.
|
||
2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности,
|
||
относящиеся к той же предметной области, что описаны в задании и реализация которых
|
||
бы в приложении потребовала применения паттерна.
|
||
### Ограничения:
|
||
- На каждый паттерн свои сущности
|
||
- В качестве источника сущностей использовать предметную область задания 3 лабораторной работы, а не элементы разработки (что-то типа «У меня паттерн Singleton, укажу ка я класс-подключение к БД через него», не принимается).
|
||
3) Создать диаграммы классов, отражающие взаимодействие новых
|
||
сущностей (а также используемый паттерн) с классами,
|
||
созданными в рамках 3 лабораторной работы. Отдельно отметить
|
||
классы, которые являются участниками паттерна
|
||
|
||
## Вариант 3: _Adapter, Composite, Proxy_
|
||
### Паттерн Adapter
|
||
Паттерн Адаптер используется для того,
|
||
чтобы объекты с несовместимыми интерфейсами могли работать вместе.
|
||
Он оборачивает один интерфейс в другой,
|
||
делая несовместимые классы совместимыми без изменения их исходного кода.
|
||
|
||
Задачи, которые решает паттерн Adapter:
|
||
- Интеграция стороннего кода или библиотек:
|
||
когда требуется использовать стороннюю библиотеку с вашим приложением,
|
||
но её интерфейс отличается от имеющегося интерфейса.
|
||
- Обратная совместимость: когда нужно подключить новый код к старому интерфейсу, не изменяя существующий.
|
||
- Упрощение взаимодействия: уменьшает сложность работы с несколькими несовместимыми компонентами.
|
||
|
||
Участники:
|
||
- Target: представляет объекты, которые используются клиентом.
|
||
- Client: использует объекты Target для реализации своих задач.
|
||
- Adaptee: представляет адаптируемый класс, который хотелось бы использовать у клиента вместо объектов Target.
|
||
- Adapter: сам адаптер, который позволяет работать с объектами Adaptee как с объектами Target.
|
||
|
||
**Пример реализации для рассматриваемой предметной области:**<br>
|
||
|
||
Классы, реализующие паттерн:
|
||
- IStudentTracker (Target) – Интерфейс системы отслеживания успеваемости студентов
|
||
- StudentManager (Client) – Использует данные о успеваемости, для определеня судьбы студентов
|
||
- AttendanceTracker (Adaptee) – Реализализовывает систему отслеживания посещаемости студентов
|
||
- StudentTrackerAdapter (Adapter) – "оборачивает" стороннюю систему и преобразует её в интерфейс, ожидаемый клиентом
|
||
|
||
![img_3.png](img_3.png)
|
||
|
||
### Паттерн Composite
|
||
Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру
|
||
по принципу "часть-целое и позволяет клиенту одинаково работать как с отдельными объектами,
|
||
так и с группой объектов.
|
||
|
||
Образно реализацию паттерна можно представить в виде меню,
|
||
которое имеет различные пункты. Эти пункты могут содержать подменю, в которых,
|
||
в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню,
|
||
а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню,
|
||
так и со всем меню в целом.
|
||
|
||
Участники:
|
||
|
||
- Component – определяет интерфейс для всех компонентов в древовидной структуре
|
||
- Composite – представляет компонент, который может содержать другие компоненты
|
||
и реализует механизм для их добавления и удаления
|
||
- Leaf – представляет отдельный компонент, который не может содержать другие компоненты
|
||
- Client – клиент, который использует компоненты
|
||
|
||
Классы, реализующие паттерн:
|
||
- IStudent (Component) – Студент обучающийся в вузе
|
||
- Group (Composite) – Группировка студентов (групаа в потоке, поток, курс...)
|
||
- Student (Leaf) – Конкретный студент
|
||
- University (Client) – Обеспечивает обучение студентов
|
||
|
||
![img.png](img.png)
|
||
|
||
### Паттерн Proxy
|
||
|
||
Паттерн Заместитель (Proxy) предоставляет объект-заместитель, который управляет доступом к другому объекту.
|
||
То есть создается объект-суррогат, который может выступать в роли другого объекта и замещать его.
|
||
|
||
Участники:
|
||
|
||
- Subject – определяет общий интерфейс для Proxy и RealSubject. Поэтому Proxy может использоваться вместо RealSubject
|
||
- RealSubject – представляет реальный объект, для которого создается прокси
|
||
- Proxy – заместитель реального объекта. Хранит ссылку на реальный объект, контролирует к нему доступ,
|
||
может управлять его созданием и удалением. При необходимости Proxy переадресует запросы объекту RealSubject
|
||
- Client – использует объект Proxy для доступа к объекту RealSubject
|
||
|
||
Классы, реализующие паттерн:
|
||
- IStudent (Subject) – Студент
|
||
- Student (RealSubject) – Студент из группы
|
||
- Elder (Proxy) – Староста отвечает на вопросы преподователя, при надомности спрашивает студентов группы
|
||
- Lecturer (Client) - Задаёт вопросы студентам через старосту
|
||
|
||
![img_2.png](img_2.png) |