Файл: уфимский университет науки и технологий факультет математики и информационных технологий кафедра программирования и экономической информатики.docx
Добавлен: 10.11.2023
Просмотров: 652
Скачиваний: 23
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕВЫСШЕГООБРАЗОВАНИЯ«УФИМСКИЙ УНИВЕРСИТЕТ НАУКИ И ТЕХНОЛОГИЙ»ФАКУЛЬТЕТ МАТЕМАТИКИ И ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ КАФЕДРА ПРОГРАММИРОВАНИЯ И ЭКОНОМИЧЕСКОЙ ИНФОРМАТИКИ02.03.03 «Математическое обеспечение и администрирование информационных систем»«Системное и интернет-программирование»Информатика и программированиеКурсовая работаШаблоны проектирования. Структурные паттерны- Паттерн «Декоратор» (Decorator)Научныйруководитель (ученая степень, звание, должность) Выполнил:студент 2курсак.ф.-м.н. наук, очнойформы обучения группы 27Доцент Иванов Ю.С.Трунов К.В. (Фамилия И.О.)(Фамилия И.О.)УФА – 2023Содержание
Cтроитель (Builder) -это паттерн проектирования, который используется для создания сложных объектов шаг за шагом. Он позволяет создавать различные варианты объектов, используя один и тот же процесс конструирования. 22
Плюсы 22
Упрощение создания сложных объектов: Паттерн Строитель позволяет разделить процесс создания сложного объекта на отдельные шаги. Это упрощает конструирование объекта и делает его более читаемым и поддерживаемым. 22
Гибкость и расширяемость: Строитель позволяет создавать различные варианты объектов, в зависимости от требований. Вы можете использовать разные строители для создания объектов с различными свойствами или конфигурациями. 22
Отделение процесса конструирования от самого объекта: Паттерн Строитель отделяет процесс создания объекта от самого объекта, что позволяет изменять процесс конструирования без изменения самого объекта. Это упрощает поддержку и повторное использование кода. 22
Поддержка неизменяемости объектов: При использовании паттерна Строитель вы можете создавать неизменяемые объекты, то есть объекты, у которых значения свойств устанавливаются только один раз во время создания. Это помогает обеспечить безопасность и надежность объектов. 22
Поддержка пошаговой отладки: При использовании паттерна Строитель вы можете пошагово отслеживать процесс создания объекта и проверять промежуточные результаты. Это полезно при отладке и обнаружении ошибок в процессе конструирования объекта. 22
Минусы 23
Минусы прототипа: 25
Неправильное использование может привести к ухудшению производительности: Если клонирование объектов является сложной и затратной операцией, неправильное использование прототипа может привести к ухудшению производительности программы. В таких случаях более подходящим может быть использование других паттернов или подходов к созданию объектов. 25
Необходимость поддержки клонирования объектов: Чтобы использовать прототип, объекты должны поддерживать операцию клонирования. Это означает, что классы должны реализовывать интерфейс Cloneable или иметь свой механизм клонирования. Это может быть затруднительно, если классы не предусмотрены для клонирования. 25
Плюсы 26
Минусы 26
Введение Объектно-ориентированное программирование с использованием шаблонов проектирования призвано облегчить работу проектировщиков и разработчиков программного обеспечения. Но изучение и успешное использование этих методов может оказаться достаточно сложным делом. Шаблоны проектирования — это руководства по решению повторяющихся проблем. Это не классы, пакеты или библиотеки, которые можно было бы подключить к вашему приложению и сидеть в ожидании чуда. Они скорее являются методиками решения определенных проблем в определенных ситуациях.Шаблон проектирования, или паттерн, в разработке программного обеспечения — повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования, в рамках некоторого часто возникающего контекста.Типы шаблонов: структурные, порождающие и поведенческие. Структурные шаблоны проектирования имеют дело со способами представления объектов (такими, как деревья или связные списки). Они удобны во многих случаях, поскольку позволяют пользоваться множеством объектов как единым целым. порождающие шаблон проектирования связаны со способами создания сложных объектов, таких как лабиринты и деревья. порождающие шаблоны проектирования позволяют разнообразить создание объектов и управлять им, в том числе координировать группы объектов, создаваемые в ходе работы приложения. Без порождающие шаблонов проектирования пришлось бы писать отдельный программный код для каждого типа объектов или группы объектов, которые могут понадобиться в ходе работы приложения. порождающие образцы проектирования обычно создают объекты при помощи отдельного объекта или метода без прямого использования конструкторов. Поведенческий шаблон проектирования позволяет нам следить за поведением объектов. Шаблоны проектирования могут быть применены на уровне архитектуры и (или) на уровне детального проектирования. Применение каждого шаблона проектирования зависит от клиента – кода, который нуждается в сервисе, предоставляемом образцом проектирования. Клиент ссылается на точку входа шаблона проектирования (обычно это метод класса внутри образца). Кроме того, обычно подразумевается и третий тип кода, который можно назвать установочным кодом. Он устанавливает состояние шаблона проектирования. Установочный код не предназначен для повторного использования и предоставляет клиентам возможность легко взаимодействовать с шаблона проектирования. В частности, для работы с шаблоном проектирования клиенту следует знать как можно меньше о его структуре и внутренней работе.
public FurnitureСhair(Furniture p): base(p.Name + ", стул", p){ }public override int GetCost(){return furniture.GetCost() + 5;}}В качестве компонента здесь выступает абстрактный класс Furniture, который определяет базовую функциональность в виде свойства Name и метода GetCost(). Эта функциональность реализуется двумя подклассами FurnitureKitchen и FurnitureBedroom, в которых жестко закодированы название мебели и цена.Декоратором является абстрактный класс FurnitureDecorator, который унаследован от класса Furniture и содержит ссылку на декорируемый объект Furniture. В отличие от формальной схемы здесь установка декорируемого объекта происходит не в методе SetComponent, а в конструкторе.Отдельные функциональности - добавление в комнаты дополнительную мебель реализованы через классы FurnitureKitchen и FurnitureBedroom, которые обертывают объект Furniture и добавляют к его имени название добавки, а к цене - стоимость добавки, то есть переопределяя метод GetCost и изменяя значение свойства Name.Благодаря этому при создании комнаты с доп. мебелью произойдет ее обертывание декоратором:Furniture furniture3 = new FurnitureBedroom();furniture3 = new FurnitureTable(furniture3);furniture3 = new FurnitureСhair(furniture3);Сначала объект FurnitureBedroom обертывается декоратором FurnitureTable, а затем FurnitureСhair. И таких обертываний мы можем сделать множество. Просто достаточно унаследовать от декоратора класс, который будет определять дополнительный функционал.А если бы мы использовали наследование, то в данном случае только для двух комнат с двумя дополнительными видами мебели нам бы пришлось создать восемь различных классов, которые бы описывали все возможные комбинации. Поэтому декораторы являются более предпочтительным в данном случае методом.
Cтроитель (Builder) -это паттерн проектирования, который используется для создания сложных объектов шаг за шагом. Он позволяет создавать различные варианты объектов, используя один и тот же процесс конструирования. 22
Плюсы 22
Упрощение создания сложных объектов: Паттерн Строитель позволяет разделить процесс создания сложного объекта на отдельные шаги. Это упрощает конструирование объекта и делает его более читаемым и поддерживаемым. 22
Гибкость и расширяемость: Строитель позволяет создавать различные варианты объектов, в зависимости от требований. Вы можете использовать разные строители для создания объектов с различными свойствами или конфигурациями. 22
Отделение процесса конструирования от самого объекта: Паттерн Строитель отделяет процесс создания объекта от самого объекта, что позволяет изменять процесс конструирования без изменения самого объекта. Это упрощает поддержку и повторное использование кода. 22
Поддержка неизменяемости объектов: При использовании паттерна Строитель вы можете создавать неизменяемые объекты, то есть объекты, у которых значения свойств устанавливаются только один раз во время создания. Это помогает обеспечить безопасность и надежность объектов. 22
Поддержка пошаговой отладки: При использовании паттерна Строитель вы можете пошагово отслеживать процесс создания объекта и проверять промежуточные результаты. Это полезно при отладке и обнаружении ошибок в процессе конструирования объекта. 22
Минусы 23
Минусы прототипа: 25
Неправильное использование может привести к ухудшению производительности: Если клонирование объектов является сложной и затратной операцией, неправильное использование прототипа может привести к ухудшению производительности программы. В таких случаях более подходящим может быть использование других паттернов или подходов к созданию объектов. 25
Необходимость поддержки клонирования объектов: Чтобы использовать прототип, объекты должны поддерживать операцию клонирования. Это означает, что классы должны реализовывать интерфейс Cloneable или иметь свой механизм клонирования. Это может быть затруднительно, если классы не предусмотрены для клонирования. 25
Плюсы 26
Минусы 26
Введение Объектно-ориентированное программирование с использованием шаблонов проектирования призвано облегчить работу проектировщиков и разработчиков программного обеспечения. Но изучение и успешное использование этих методов может оказаться достаточно сложным делом. Шаблоны проектирования — это руководства по решению повторяющихся проблем. Это не классы, пакеты или библиотеки, которые можно было бы подключить к вашему приложению и сидеть в ожидании чуда. Они скорее являются методиками решения определенных проблем в определенных ситуациях.Шаблон проектирования, или паттерн, в разработке программного обеспечения — повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования, в рамках некоторого часто возникающего контекста.Типы шаблонов: структурные, порождающие и поведенческие. Структурные шаблоны проектирования имеют дело со способами представления объектов (такими, как деревья или связные списки). Они удобны во многих случаях, поскольку позволяют пользоваться множеством объектов как единым целым. порождающие шаблон проектирования связаны со способами создания сложных объектов, таких как лабиринты и деревья. порождающие шаблоны проектирования позволяют разнообразить создание объектов и управлять им, в том числе координировать группы объектов, создаваемые в ходе работы приложения. Без порождающие шаблонов проектирования пришлось бы писать отдельный программный код для каждого типа объектов или группы объектов, которые могут понадобиться в ходе работы приложения. порождающие образцы проектирования обычно создают объекты при помощи отдельного объекта или метода без прямого использования конструкторов. Поведенческий шаблон проектирования позволяет нам следить за поведением объектов. Шаблоны проектирования могут быть применены на уровне архитектуры и (или) на уровне детального проектирования. Применение каждого шаблона проектирования зависит от клиента – кода, который нуждается в сервисе, предоставляемом образцом проектирования. Клиент ссылается на точку входа шаблона проектирования (обычно это метод класса внутри образца). Кроме того, обычно подразумевается и третий тип кода, который можно назвать установочным кодом. Он устанавливает состояние шаблона проектирования. Установочный код не предназначен для повторного использования и предоставляет клиентам возможность легко взаимодействовать с шаблона проектирования. В частности, для работы с шаблоном проектирования клиенту следует знать как можно меньше о его структуре и внутренней работе.
-
Структурные шаблоны
-
Декоратор (Decorator)
-
Component: абстрактный класс, который определяет интерфейс для наследуемых объектов
-
ConcreteComponent: конкретная реализация компонента, в которую с помощью декоратора добавляется новая функциональность
-
Decorator: собственно декоратор, реализуется в виде абстрактного класса и имеет тот же базовый класс, что и декорируемые объекты. Поэтому базовый класс Component должен быть по возможности легким и определять только базовый интерфейс.
-
Классы ConcreteDecoratorA и ConcreteDecoratorB представляют дополнительные функциональности, которыми должен быть расширен объект ConcreteComponent.
public FurnitureСhair(Furniture p): base(p.Name + ", стул", p){ }public override int GetCost(){return furniture.GetCost() + 5;}}В качестве компонента здесь выступает абстрактный класс Furniture, который определяет базовую функциональность в виде свойства Name и метода GetCost(). Эта функциональность реализуется двумя подклассами FurnitureKitchen и FurnitureBedroom, в которых жестко закодированы название мебели и цена.Декоратором является абстрактный класс FurnitureDecorator, который унаследован от класса Furniture и содержит ссылку на декорируемый объект Furniture. В отличие от формальной схемы здесь установка декорируемого объекта происходит не в методе SetComponent, а в конструкторе.Отдельные функциональности - добавление в комнаты дополнительную мебель реализованы через классы FurnitureKitchen и FurnitureBedroom, которые обертывают объект Furniture и добавляют к его имени название добавки, а к цене - стоимость добавки, то есть переопределяя метод GetCost и изменяя значение свойства Name.Благодаря этому при создании комнаты с доп. мебелью произойдет ее обертывание декоратором:Furniture furniture3 = new FurnitureBedroom();furniture3 = new FurnitureTable(furniture3);furniture3 = new FurnitureСhair(furniture3);Сначала объект FurnitureBedroom обертывается декоратором FurnitureTable, а затем FurnitureСhair. И таких обертываний мы можем сделать множество. Просто достаточно унаследовать от декоратора класс, который будет определять дополнительный функционал.А если бы мы использовали наследование, то в данном случае только для двух комнат с двумя дополнительными видами мебели нам бы пришлось создать восемь различных классов, которые бы описывали все возможные комбинации. Поэтому декораторы являются более предпочтительным в данном случае методом.
-
Адаптер (Adapter)
-
Позволяет интегрировать уже существующий код в новую систему без необходимости его изменения. Это особенно полезно, если вы используете сторонние библиотеки или компоненты, которые не соответствуют требуемому интерфейсу. -
Облегчает повторное использование кода, поскольку можно адаптировать существующие классы для работы в различных контекстах. -
Упрощает тестирование, поскольку можно создавать адаптеры, имитирующие различные условия, и проверять взаимодействие с объектами. -
Позволяет сократить зависимость между компонентами системы, поскольку адаптер скрывает детали взаимодействия между классами.