report
This commit is contained in:
parent
eae958424a
commit
ad13c0837a
537
Report/report.md
Normal file
537
Report/report.md
Normal file
@ -0,0 +1,537 @@
|
|||||||
|
# Лабораторная работа 1
|
||||||
|
## Компоненты:
|
||||||
|
|
||||||
|
### CustomDataTable:
|
||||||
|
Визуальный компонент вывода таблицы значений
|
||||||
|
|
||||||
|
__Публичные Методы__:
|
||||||
|
- Определить структуру таблицы
|
||||||
|
```c#
|
||||||
|
void ConfigureColumns(params CustomDataTableColumnParameter[] columnParameters)
|
||||||
|
```
|
||||||
|
CustomDataTableColumnParameter
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// Параметры столбца таблицы
|
||||||
|
/// </summary>
|
||||||
|
public record CustomDataTableColumnParameter
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Заголовок
|
||||||
|
/// </summary>
|
||||||
|
public string HeaderName { get; init; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ширина
|
||||||
|
/// </summary>
|
||||||
|
public int Width { get; init; } = 0;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Видимость
|
||||||
|
/// </summary>
|
||||||
|
public bool Visible { get; init; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Название свойства
|
||||||
|
/// </summary>
|
||||||
|
public string PropertyName { get; init; } = string.Empty;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
- Отчистить таблицу
|
||||||
|
```c#
|
||||||
|
public void Clear()
|
||||||
|
```
|
||||||
|
- Заполнить таблицу
|
||||||
|
```c#
|
||||||
|
public void Fill<TType>(IList<TType> insertValues)
|
||||||
|
```
|
||||||
|
|
||||||
|
__Публичные Функции__:
|
||||||
|
- Получить стоку таблицы в виде объекта
|
||||||
|
```c#
|
||||||
|
public TType? GetRow<TType>(int rowIndex) where TType : new()
|
||||||
|
```
|
||||||
|
|
||||||
|
__Свойства__:
|
||||||
|
- Индекс выбранной строки
|
||||||
|
```c#
|
||||||
|
public int SelectedRow
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### CustomListBox
|
||||||
|
Визуальный компонент выбора из списка значений
|
||||||
|
|
||||||
|
__Публичные Методы__:
|
||||||
|
- Заполнить список значениями
|
||||||
|
```c#
|
||||||
|
public void FillValues(IEnumerable<string> strings)
|
||||||
|
```
|
||||||
|
- Очистить список
|
||||||
|
```c#
|
||||||
|
public void Clear()
|
||||||
|
```
|
||||||
|
|
||||||
|
__Свойства__:
|
||||||
|
- Событие возникающие при изменении списка
|
||||||
|
```c#
|
||||||
|
public event EventHandler ValueChanged
|
||||||
|
```
|
||||||
|
- Обработка ошибок
|
||||||
|
```c#
|
||||||
|
public event Action<Exception> AnErrorOccurred
|
||||||
|
```
|
||||||
|
- Выбранное значение
|
||||||
|
```c#
|
||||||
|
public string Selected
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### CustomNumericInputField
|
||||||
|
Визуальный компонент ввода целочисленного значения допускающего null
|
||||||
|
|
||||||
|
__Свойства__:
|
||||||
|
- Событие возникающие при изменении поля ввода
|
||||||
|
```c#
|
||||||
|
public event EventHandler NumericInputChanged
|
||||||
|
```
|
||||||
|
- Обработка ошибок
|
||||||
|
```c#
|
||||||
|
public event Action<Exception> AnErrorOccurred
|
||||||
|
```
|
||||||
|
- Значения поля ввода
|
||||||
|
```c#
|
||||||
|
public int? Value
|
||||||
|
```
|
||||||
|
_Возможно исключение ```InvalidNumericInputValueException```_
|
||||||
|
|
||||||
|
|
||||||
|
# Лабораторная работа 2
|
||||||
|
## Компоненты:
|
||||||
|
|
||||||
|
### CustomPdfTable
|
||||||
|
|
||||||
|
Компонент для сохранения таблицы в пдф
|
||||||
|
|
||||||
|
__Публичные Методы__:
|
||||||
|
- Определить структуру таблицы
|
||||||
|
```c#
|
||||||
|
public void SaveToPdf(PdfTableInfo tableInfo)
|
||||||
|
```
|
||||||
|
PdfTableInfo
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// Параметры для создания таблиц в пдф
|
||||||
|
/// </summary>
|
||||||
|
public record PdfTableInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// имя файла (включая путь до файла)
|
||||||
|
/// </summary>
|
||||||
|
public string FilePath { get; init; } = @"C:\pdfTable.pdf";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// название документа(заголовок в документе)
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; init; } = "Таблица";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список таблиц
|
||||||
|
/// </summary>
|
||||||
|
public IEnumerable<string[,]> Tables { get; init; } = [];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### CustomPdfTableWithGrouping
|
||||||
|
|
||||||
|
Компонент создающий таблицу и группирует элементы по 1 столбцу
|
||||||
|
__Публичные Методы__:
|
||||||
|
- Сохранить в пдф
|
||||||
|
```c#
|
||||||
|
public void SaveToPdf<TType>(PdfTableWithGroupingInfo<TType> tableInfo) where TType : class
|
||||||
|
```
|
||||||
|
PdfTableWithGroupingInfo
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// Параметры для создания таблицы в пдф с группировкой по 1 столбцу
|
||||||
|
/// </summary>
|
||||||
|
public class PdfTableWithGroupingInfo<TType> where TType : class
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// имя файла (включая путь до файла)
|
||||||
|
/// </summary>
|
||||||
|
public string FilePath { get; init; } = @"C:\pdfTable.pdf";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// название документа(заголовок в документе)
|
||||||
|
/// </summary>
|
||||||
|
public string Title { get; init; } = "Таблица";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Высота заголовков
|
||||||
|
/// </summary>
|
||||||
|
public float HeaderHeight { get; init; } = 0.5f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Параметры столбцов
|
||||||
|
/// </summary>
|
||||||
|
public IEnumerable<ColumnInfo> Columns { get; init; } = [];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Список таблиц
|
||||||
|
/// </summary>
|
||||||
|
public IEnumerable<RowInfo<TType>> Rows { get; init; } = [];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### CustomPdfHistogram
|
||||||
|
|
||||||
|
Компонент создающий линейную диаграмму
|
||||||
|
__Публичные Методы__:
|
||||||
|
- Сохранить гистограмму в пдф
|
||||||
|
```c#
|
||||||
|
public void SaveToPdf(PdfHistigramInfo histogramInfo)
|
||||||
|
```
|
||||||
|
PdfHistigramInfo
|
||||||
|
```c#
|
||||||
|
/// <summary>
|
||||||
|
/// Параметры для создания линейной диаграммы
|
||||||
|
/// </summary>
|
||||||
|
public record PdfHistigramInfo
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Имя файла (включая путь до файла)
|
||||||
|
/// </summary>
|
||||||
|
public string FilePath { get; init; } = @"C:\pdfTable.pdf";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Заголовок документа
|
||||||
|
/// </summary>
|
||||||
|
public string DocumentTitle { get; init; } = "Гистограмма";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Заголовок диаграммы
|
||||||
|
/// </summary>
|
||||||
|
public string HistogramTitle { get; init; } = "Гистограмма";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Расположение легенды
|
||||||
|
/// </summary>
|
||||||
|
public PdfLegendPosition LegendPosition { get; init; } = PdfLegendPosition.Bottom;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Значения
|
||||||
|
/// </summary>
|
||||||
|
public required IEnumerable<PdfHistogramLineInfo> Values { get; init; }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# Лабораторная работа 3
|
||||||
|
|
||||||
|
Программный продукт предназначен для учета успеваемости студентов и управления их данными.
|
||||||
|
Он позволяет хранить информацию о каждом студенте,
|
||||||
|
формировать отчеты в различных форматах (Word, PDF, Excel)
|
||||||
|
и визуализировать данные с помощью круговой диаграммы.
|
||||||
|
|
||||||
|
### Цель программы
|
||||||
|
Цель программы — автоматизация процесса учета успеваемости студентов, упрощение работы с данными и формирование отчетов для анализа успеваемости и стипендиальных выплат.
|
||||||
|
|
||||||
|
### Функционал программы
|
||||||
|
- Хранение данных о студентах:
|
||||||
|
|
||||||
|
1. ФИО студента.
|
||||||
|
2. Дата поступления
|
||||||
|
3. Форма обучения (выбирается из выпадающего списка).
|
||||||
|
4. Успеваемость
|
||||||
|
|
||||||
|
- Отображение данных в виде списка
|
||||||
|
Данные о студентах выводятся на главной форме в виде списка строк
|
||||||
|
|
||||||
|
- Формирование документа в PDF:
|
||||||
|
Создается таблица с данными о средних баллах студентов по сессиям.
|
||||||
|
Колонки таблицы: сессии от 1 до 6.
|
||||||
|
Строки таблицы: средние баллы студентов (без указания ФИО).
|
||||||
|
|
||||||
|
- Формирование таблицы в excel:
|
||||||
|
Создается табличный отчет с информацией по всем студентам.
|
||||||
|
|
||||||
|
Шапка таблицы:
|
||||||
|
- Id
|
||||||
|
- ФИО
|
||||||
|
- Образование
|
||||||
|
- Форма обучения
|
||||||
|
- Дата поступления
|
||||||
|
|
||||||
|
- Создание круговой диаграммы в Word:
|
||||||
|
Формируется линейная диаграмма, отображающая распределение студентов по форме обучения,
|
||||||
|
поступивших в разнык года
|
||||||
|
|
||||||
|
| Компонент | Преимущества | Недостатки |
|
||||||
|
|--------------------------|--------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| CustomDateTimePicker | Понятные и логичные названия переменных | Занимаемое компонентом место не оптимизировано (могут возникнуть трудности с контейнерами) |
|
||||||
|
| VisualSelectionComponent | Содержит большую часть требуемого функцинонала | В базовой поставке отсутствует функционал заполнения, отсутствует xml документация, функции имеют не оправдано длинное название, границы компонента занимают чуть больше места чем вложенные элементы |
|
||||||
|
| ComponentDiagram | Реализует функционал создания диограммы в текстовом документе word | Использует комерческую библиотеку с бесплатным доступом, на документе остаётся водяной знак, в функцию создания документа передаётся объект, но его поля нужно инициализировать в конструкторе, отсутствует xml документация |
|
||||||
|
| CustomExcelTable | Удобные настройки таблицы, понятные наименования функций и классов | Отсутствует xml документация |
|
||||||
|
|
||||||
|
# Лабораторная работа №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](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_3.png)
|
||||||
|
|
||||||
|
### Паттерн Composite
|
||||||
|
Паттерн Компоновщик (Composite) объединяет группы объектов в древовидную структуру
|
||||||
|
по принципу "часть-целое и позволяет клиенту одинаково работать как с отдельными объектами,
|
||||||
|
так и с группой объектов.
|
||||||
|
|
||||||
|
Образно реализацию паттерна можно представить в виде меню,
|
||||||
|
которое имеет различные пункты. Эти пункты могут содержать подменю, в которых,
|
||||||
|
в свою очередь, также имеются пункты. То есть пункт меню служит с одной стороны частью меню,
|
||||||
|
а с другой стороны еще одним меню. В итоге мы однообразно можем работать как с пунктом меню,
|
||||||
|
так и со всем меню в целом.
|
||||||
|
|
||||||
|
Участники:
|
||||||
|
|
||||||
|
- Component – определяет интерфейс для всех компонентов в древовидной структуре
|
||||||
|
- Composite – представляет компонент, который может содержать другие компоненты
|
||||||
|
и реализует механизм для их добавления и удаления
|
||||||
|
- Leaf – представляет отдельный компонент, который не может содержать другие компоненты
|
||||||
|
- Client – клиент, который использует компоненты
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
- IStudent (Component) – Студент обучающийся в вузе
|
||||||
|
- Group (Composite) – Группировка студентов (групаа в потоке, поток, курс...)
|
||||||
|
- Student (Leaf) – Конкретный студент
|
||||||
|
- University (Client) – Обеспечивает обучение студентов
|
||||||
|
|
||||||
|
![img.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/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](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_2.png)
|
||||||
|
|
||||||
|
|
||||||
|
# Лабораторная работа №6.
|
||||||
|
# Применение структурных паттернов.
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться,
|
||||||
|
какие участники там фигурируют.
|
||||||
|
2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности,
|
||||||
|
относящиеся к той же предметной области, что описаны в задании и реализация которых
|
||||||
|
бы в приложении потребовала применения паттерна.
|
||||||
|
### Ограничения
|
||||||
|
- На каждый паттерн свои сущности
|
||||||
|
- В качестве источника сущностей использовать предметную область задания 3 лабораторной работы,
|
||||||
|
а не элементы разработки (что-то типа «У меня паттерн Singleton,
|
||||||
|
укажу ка я класс-подключение к БД через него», не принимается).
|
||||||
|
3) Создать диаграммы классов, отражающие взаимодействие новых
|
||||||
|
сущностей (а также используемый паттерн) с классами,
|
||||||
|
созданными в рамках 3 лабораторной работы. Отдельно отметить
|
||||||
|
классы, которые являются участниками паттерна
|
||||||
|
|
||||||
|
## Вариант 3 _AbstractFactory, FactoryMethod, ObjectPool._
|
||||||
|
|
||||||
|
### Паттерн AbstractFactory
|
||||||
|
|
||||||
|
Паттерн "Абстрактная фабрика" (Abstract Factory) предоставляет интерфейс для создания семейств
|
||||||
|
взаимосвязанных объектов с определенными интерфейсами без указания конкретных типов данных объектов.
|
||||||
|
|
||||||
|
Участники
|
||||||
|
|
||||||
|
- AbstractProductA и AbstractProductB – абстрактные классы, определяющие интерфейс для классов,
|
||||||
|
объекты которых будут создаваться в программе
|
||||||
|
- ProductA1 / ProductA2 и ProductB1 / ProductB2 – конкретные классы,
|
||||||
|
представляющие конкретную реализацию абстрактных классов.
|
||||||
|
- AbstractFactory - Абстрактный класс фабрики определяет методы для создания объектов.
|
||||||
|
Причем методы возвращают абстрактные продукты, а не их конкретные реализации.
|
||||||
|
- Client – класс клиента, использующий класс фабрики для создания объектов.
|
||||||
|
При этом он использует исключительно абстрактный класс фабрики AbstractFactory
|
||||||
|
и абстрактные классы продуктов AbstractProductA и AbstractProductB и никак не зависит от их конкретных реализаций.
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
|
||||||
|
- IReportFactory (Abstract Factory) интерфейс фабрики для создания отчетов.
|
||||||
|
- FivePointReportFactory (Concrete Factory) фабрика для 5-балльной системы.
|
||||||
|
- HundredPointReportFactory (Concrete Factory) фабрика для 100-балльной системы.
|
||||||
|
- IPerformanceReport (Abstract Product) интерфейс для отчета по успеваемости.
|
||||||
|
- FivePointPerformanceReport и HundredPointPerformanceReport (Concrete Products) конкретные реализации отчетов по успеваемости для 5- и 10-балльной систем.
|
||||||
|
- ILaggingStudentsReport (Abstract Product) интерфейс для отчета по отстающим студентам.
|
||||||
|
- FivePointLaggingStudentsReport и HundredPointLaggingStudentsReport (Concrete Products) отчеты по отстающим студентам для 5- и 10-балльной систем.
|
||||||
|
- ReportManager (Client) класс, который обрабатывает отчеты
|
||||||
|
|
||||||
|
![img_4.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_4.png)
|
||||||
|
|
||||||
|
### Паттерн FactoryMethod
|
||||||
|
|
||||||
|
Фабричный метод (Factory Method) - это паттерн, который определяет интерфейс для создания объектов некоторого класса,
|
||||||
|
но непосредственное решение о том, объект какого класса создавать происходит в подклассах.
|
||||||
|
То есть паттерн предполагает, что базовый класс делегирует создание объектов классам-наследникам.
|
||||||
|
|
||||||
|
Участники:
|
||||||
|
|
||||||
|
- Product – интерфейс или абстрактный класс, определяющий структуру создаваемых объектов.
|
||||||
|
- ConcreteProductA и ConcreteProductB – конкретные реализации интерфейса “Product”, представляющие первый и второй тип продукта.
|
||||||
|
- Creator – абстрактный класс или интерфейс, который определяет фабричный метод для создания объектов типа “Product”.
|
||||||
|
- ConcreteCreatorA и ConcreteCreatorB – конкретные реализации “Creator”, которая создаёт объекты типа “ConcreteProductA” и “ConcreteCreatorB” соответственно.
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
|
||||||
|
- Product IReport – определяет интерфейс для всех отчетов.
|
||||||
|
- ConcreteProductA и ConcreteProductB GradeReport и AttendanceReport – конкретные реализации интерфейса “IReport”.
|
||||||
|
- Creator ReportCreator – определяет фабричный метод для создания объектов типа “IReport”.
|
||||||
|
- ConcreteCreatorA и ConcreteCreatorB GradeReportCreator и AttendanceReportCreator – конкретные реализации “ReportCreator”.
|
||||||
|
|
||||||
|
![img_5.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_5.png)
|
||||||
|
|
||||||
|
### Паттерн ObjectPool
|
||||||
|
|
||||||
|
Object Pool (пул объектов) — это поведенческий паттерн, который используется для оптимизации управления ресурсами.
|
||||||
|
Он позволяет многократно использовать уже созданные объекты вместо их повторного создания и уничтожения.
|
||||||
|
Это особенно полезно, когда создание объектов является дорогой операцией с точки зрения времени или ресурсов.
|
||||||
|
|
||||||
|
Участники:
|
||||||
|
|
||||||
|
- Pool – управляет коллекцией объектов. Отвечает за выдачу и возврат объектов из пула. Решает, когда создавать новый объект или использовать существующий.
|
||||||
|
- ReusableObject (повторно используемый объект) - объект, который находится в пуле и может быть многократно использован. Включает логику и состояние объекта.
|
||||||
|
- Client - получает объект из пула для использования. Возвращает объект обратно в пул, когда он больше не нужен.
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
|
||||||
|
- Pool FormatPool – управляет доступностью объектов “Format”. Позволяет выдавать объекты формы обучения для студентов.
|
||||||
|
- ReusableObject Format – содержит данные, связанные с конкретной формой обучения.
|
||||||
|
- Client Student – представляет студента и содержит данные о нем.
|
||||||
|
|
||||||
|
![img_6.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_6.png)
|
||||||
|
|
||||||
|
|
||||||
|
# Лабораторная работа №7.
|
||||||
|
# Применение структурных паттернов.
|
||||||
|
|
||||||
|
## Задание
|
||||||
|
1) Дать описание паттернов, указанных во вариантах, для каких целей они могут применяться,
|
||||||
|
какие участники там фигурируют.
|
||||||
|
2) На основе задания из 3 лабораторной работы, для каждого паттерна придумать сущности,
|
||||||
|
относящиеся к той же предметной области, что описаны в задании и реализация которых
|
||||||
|
бы в приложении потребовала применения паттерна.
|
||||||
|
### Ограничения
|
||||||
|
- На каждый паттерн свои сущности
|
||||||
|
- В качестве источника сущностей использовать предметную область задания 3 лабораторной работы,
|
||||||
|
а не элементы разработки (что-то типа «У меня паттерн Singleton,
|
||||||
|
укажу ка я класс-подключение к БД через него», не принимается).
|
||||||
|
3) Создать диаграммы классов, отражающие взаимодействие новых
|
||||||
|
сущностей (а также используемый паттерн) с классами,
|
||||||
|
созданными в рамках 3 лабораторной работы. Отдельно отметить
|
||||||
|
классы, которые являются участниками паттерна
|
||||||
|
|
||||||
|
## Вариант 3 _Mediator, Mediator (2 различных реализации), Strategy._
|
||||||
|
|
||||||
|
### Паттерн Mediator
|
||||||
|
|
||||||
|
Паттерн "Посредник" (Mediator) представляет такой шаблон проектирования,
|
||||||
|
который обеспечивает взаимодействие множества объектов без необходимости ссылаться друг на друга.
|
||||||
|
Тем самым достигается слабосвязанность взаимодействующих объектов.
|
||||||
|
|
||||||
|
Участники
|
||||||
|
|
||||||
|
- Mediator - представляет интерфейс для взаимодействия с объектами Colleague.
|
||||||
|
- Colleague - представляет интерфейс для взаимодействия с объектом Mediator.
|
||||||
|
- ConcreteColleague1 и ConcreteColleague2 - конкретные классы коллег,
|
||||||
|
которые обмениваются друг с другом через объект Mediator.
|
||||||
|
- ConcreteMediator - конкретный посредник, реализующий интерфейс типа Mediator.
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
- Secretary Mediator - Секретарь
|
||||||
|
- Client Colleague - Участник вузовской системы
|
||||||
|
- Teacher ConcreteColleague1 - Преподователь
|
||||||
|
- Student ConcreteColleague2 - Студент
|
||||||
|
- Dean`s Office ConcreteMediator - Деканат
|
||||||
|
|
||||||
|
![img_8.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_8.png)
|
||||||
|
|
||||||
|
- ILms Mediator - Сайт лмс
|
||||||
|
- User Colleague - Пользователь лмс
|
||||||
|
- Teacher ConcreteColleague1 - Преподователь
|
||||||
|
- Student ConcreteColleague2 - Студент
|
||||||
|
- Lms ConcreteMediator - Логика сайта лмс
|
||||||
|
|
||||||
|
![img_7.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_7.png)
|
||||||
|
|
||||||
|
### Паттерн Strategy
|
||||||
|
|
||||||
|
Strategy (Стратегия) — шаблон проектирования, который определяет набор алгоритмов, инкапсулирует каждый из них и обеспечивает их взаимозаменяемость. В зависимости от ситуации мы можем легко заменить один используемый алгоритм другим. При этом замена алгоритма происходит независимо от объекта, который использует данный алгоритм.
|
||||||
|
|
||||||
|
Участники:
|
||||||
|
|
||||||
|
- IStrategy: интерфейс, который определяет метод Algorithm(). Это общий интерфейс для всех реализующих его алгоритмов. Вместо интерфейса здесь также можно было бы использовать абстрактный класс.
|
||||||
|
- ConcreteStrategy1 и ConcreteStrategy2: классы, которые реализуют интерфейс IStrategy, предоставляя свою версию метода Algorithm(). Подобных классов-реализаций может быть множество.
|
||||||
|
- Context: класс, который хранит ссылку на объект IStrategy и связан с интерфейсом IStrategy отношением агрегации.
|
||||||
|
|
||||||
|
Классы, реализующие паттерн:
|
||||||
|
|
||||||
|
- IStrategy IReportStrategy – общий интерфейс для всех стратегий формирования отчетов.
|
||||||
|
- PdfReportStrategy, ExcelkReportStrategy, WordReportStrategy - классы, реализующие формирование отчета в pdf, excel и word.
|
||||||
|
- Context ReportContext – контекст, который использует стратегию для формирования отчета.
|
||||||
|
|
||||||
|
Этот подход позволяет легко добавлять новые форматы отчетов (например, JSON или HTML) без изменения существующего кода, реализуя принцип открытости/закрытости.
|
||||||
|
|
||||||
|
![img_9.png](https://git.is.ulstu.ru/bekodeg/Cop.Borovkov.Var3/src/branch/dev/Lab5-6/img_9.png)
|
Loading…
Reference in New Issue
Block a user