# Лабораторная работа №5. # Применение структурных паттернов. ## Задание 1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться, какие участники там фигурируют. 2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности, относящиеся к той же предметной области, что описаны в задании и реализация которых бы в приложении потребовала применения паттерна. ### Ограничения: - На каждый паттерн свои сущности - В качестве источника сущностей использовать предметную область задания 3 лабораторной работы, а не элементы разработки (что-то типа «У меня паттерн Singleton, укажу ка я класс-подключение к БД через него», не принимается). 3) Создать диаграммы классов, отражающие взаимодействие новых сущностей (а также используемый паттерн) с классами, созданными в рамках 3 лабораторной работы. Отдельно отметить классы, которые являются участниками паттерна ## Вариант 3: _Adapter, Composite, Proxy_ ### Паттерн Adapter Паттерн Адаптер используется для того, чтобы объекты с несовместимыми интерфейсами могли работать вместе. Он оборачивает один интерфейс в другой, делая несовместимые классы совместимыми без изменения их исходного кода. Задачи, которые решает паттерн Adapter: - Интеграция стороннего кода или библиотек: когда требуется использовать стороннюю библиотеку с вашим приложением, но её интерфейс отличается от имеющегося интерфейса. - Обратная совместимость: когда нужно подключить новый код к старому интерфейсу, не изменяя существующий. - Упрощение взаимодействия: уменьшает сложность работы с несколькими несовместимыми компонентами. Участники: - Target: представляет объекты, которые используются клиентом. - Client: использует объекты Target для реализации своих задач. - Adaptee: представляет адаптируемый класс, который хотелось бы использовать у клиента вместо объектов Target. - Adapter: сам адаптер, который позволяет работать с объектами Adaptee как с объектами Target. **Пример реализации для рассматриваемой предметной области:**
Классы, реализующие паттерн: - IStudentTracker (Target) – Интерфейс системы отслеживания успеваемости студентов - StudentManager (Client) – Использует данные о успеваемости, для определеня судьбы студентов - UniversitySystem (Adaptee) – Реализализовывает систему отслеживания успеваемости студентов - StudentTrackerAdapter (Adapter) – "оборачивает" стороннюю систему и преобразует её в интерфейс, ожидаемый клиентом ![img.png](img.png) ### Паттерн Composite Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру по принципу "часть-целое и позволяет клиенту одинаково работать как с отдельными объектами, так и с группой объектов. Образно реализацию паттерна можно представить в виде меню, которое имеет различные пункты. Эти пункты могут содержать подменю, в которых, в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню, а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню, так и со всем меню в целом. Участники: - Component – определяет интерфейс для всех компонентов в древовидной структуре - Composite – представляет компонент, который может содержать другие компоненты и реализует механизм для их добавления и удаления - Leaf – представляет отдельный компонент, который не может содержать другие компоненты - Client – клиент, который использует компоненты Классы, реализующие паттерн: - path (Component) – путь к объекту на диске - FolderPath (Composite) – Путь к папке - FilePath (Leaf) – Путь к файлу - FormMain (Client) – Просматревает дерево папок в поисках файлов с типом .dll ### Паттерн Proxy Паттерн Заместитель (Proxy) предоставляет объект-заместитель, который управляет доступом к другому объекту. То есть создается объект-суррогат, который может выступать в роли другого объекта и замещать его. Участники: - Subject – определяет общий интерфейс для Proxy и RealSubject. Поэтому Proxy может использоваться вместо RealSubject - RealSubject – представляет реальный объект, для которого создается прокси - Proxy – заместитель реального объекта. Хранит ссылку на реальный объект, контролирует к нему доступ, может управлять его созданием и удалением. При необходимости Proxy переадресует запросы объекту RealSubject - Client – использует объект Proxy для доступа к объекту RealSubject Классы, реализующие паттерн: - Студент (Subject) – Абстрактный студент - Студент из группы (RealSubject) – студент из конкретной группы - Староста (Proxy) – Передаёт информацию студенту - Преподаватель (Client) - Передаёт информацию студенту через старосту