- •Лабораторная работа №4 Шаблоны проектирования
- •Теоретические сведения
- •Отношения между классами. На диаграммах классов языка uml
- •Суть паттерна
- •Решение
- •Адаптер объектов
- •Адаптер классов
- •Адаптер классов не нуждается во вложенном объекте, так как он может одновременно наследовать и часть существующего класса, и часть сервиса.
- •Фасад (Facade)
- •Концептуальный пример
- •Program.Cs:
- •Output.Txt: Результат выполнения
- •Изолирует клиентов от компонентов подсистемы Уменьшая тем самым число объектов, с которыми клиентам приходится иметь дело, упрощая работу с подсистемой.
- •Позволяет ослабить связанность между подсистемой и ее клиентами.
- •Фасад не исключает возможности приложениям напрямую обращаться к классам подсистемы, если это необходимо.
- •Заместитель (Proxy)
- •3. Локальный запуск сервиса (удалённый прокси). Когда настоящий сервисный объект находится на удалённом сервере.
- •Концептуальный пример
- •Декоратор (Decorator)
- •// Объект
- •} //Ptr2 выходит из области видимости, но объект не //освобождается, потому что есть ptr, который по-прежнему //ссылается на него } //ptr выходит из области видимости, и объект уничтожается
- •Пример на языке c#
- •Порождающие шаблоны Абстрактная фабрика (Abstract Factory)
- •1. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы.
- •3. Таким образом, еще раз - предоставляет интерфейс для создания семейств, связанных между собой, или зависимых объектов.
- •Клиент пользуется только интерфейсами, заданными в классах «Абстрактная фабрика» и «Абстрактный продукт».
- •Фабричный метод (Factory Method)
- •Void info() {
- •Void info() {
- •Void info() {
- •Int main()
- •Одиночка (Singleton) Суть паттерна
- •If(!p_instance)
- •Поведенческие шаблоны Стратегия (Strategy)
- •Стратегии построения пути.
- •Структура
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •Output.Txt: Результат выполнения
- •Void useStrategy(void)
- •Void setStrategy(Strategy* o)
- •Int main(int /*argc*/, char* /*argv*/[])
- •Наблюдатель (Observer) Суть паттерна
- •Решение
- •Структура
- •Шаги реализации
- •Концептуальный пример
- •Program.Cs: Пример структуры паттерна
- •// Random.Next(…) - Метод, возвращает случайное целое число //в указанном диапазоне.
- •Output.Txt: Результат выполнения
- •Использование паттерна Observer
- •Команда (Command)
- •Структура
- •Output.Txt: Результат выполнения
- •Задания для лабораторной работы
Лабораторная работа №4 Шаблоны проектирования
Цель работы: ознакомиться с основными шаблонами проектирования, научиться применять их при проектировании и разработке ПО.
Теоретические сведения
При создании объектно-ориентированной программы требуется разработать классы, соответствующие предметам, процессам и понятиям предметной области, а также определить взаимоотношения этих классов и протоколы взаимодействия объектов во время выполнения программы.
Задача эта весьма сложная, поскольку есть великое множество различных правильных способов объектной декомпозиции.
Архитектура системы должна, с одной стороны, соответствовать решаемой задаче, с другой — быть достаточно общей, чтобы сделать возможным внесение изменений, которые могут потребоваться в будущем.
Во многих объектно-ориентированных системах вы встретите повторяющиеся решения (паттерны), состоящие из классов и взаимодействующих объектов.
Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения — повторяемая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
Обычно шаблон не является законченным образцом, который может быть прямо преобразован в код; это лишь пример решения задачи, который можно использовать в различных ситуациях.
Объектно-ориентированные шаблоны показывают отношения и взаимодействия между классами или объектами, без определения того, какие именно конечные классы или объекты приложения будут использоваться.
Сообразное использование паттернов проектирования дает разработчику ряд неоспоримых преимуществ.
Приведем некоторые из них.
1) Модель системы, построенная в терминах паттернов проектирования, фактически является структурированным выделением тех элементов (компонентов) и связей, которые значимы при решении поставленной задачи.
2) Помимо этого, модель, построенная с использованием паттернов проектирования, более проста и наглядна в изучении, чем стандартная модель.
3) Тем не менее, несмотря на простоту и наглядность, она позволяет глубоко и всесторонне проработать архитектуру разрабатываемой системы с использованием специального языка (UML).
4) Применение паттернов проектирования повышает устойчивость системы к изменению требований и упрощает неизбежную последующую доработку системы.
5) Кроме того, трудно переоценить роль использования паттернов при интеграции информационных систем организации.
6) Также следует упомянуть, что совокупность паттернов проектирования, по сути, представляет собой единый словарь проектирования, который, будучи унифицированным средством, незаменим для общения разработчиков друг другом.
7) Но самое главное любой шаблон проектирования может стать палкой о двух концах: если он будет применен не к месту, это может обернуться катастрофой и создать вам много проблем в последующем.
8) В то же время, реализованный в нужном месте, в нужное время, он может стать для вас настоящим спасителем.
Есть три основных вида шаблонов проектирования:
● структурные;
● порождающие;
● поведенческие.
В каждой группе можно, в свою очередь, выделить два уровня, определяющих, применяется паттерн к классам или объектам.
Ниже приводится описание ряда паттернов для того, чтобы вы получили конкретное представление о наиболее простых паттернах и могли более успешно изучать специальную литературу.
Описание каждого паттерна в книгах выполнено по одной и той же схеме, включающей его назначение, область применения, структурную схему, описание входящих в него объектов и их взаимодействий, а также пример реализации.
Такой уровень документирования делает возможным использование паттерна в различных конкретных случаях, возникающих при проектировании программных систем.
Некоторые паттерны часто используются совместно. Например, Компоновщик применяется с Итератором или Посетителем.
Некоторые паттерны представляют собой альтернативные решения — так, Прототип нередко можно использовать вместо Абстрактной фабрики.
Применение различных паттернов может привести к одному и тому же проектному решению, хотя изначально их назначение отличается.
Например, Защищающий заместитель может быть реализован точно так же, как Декоратор.
Паттерны позволяют повысить степень повторной используемости и улучшить качество документирования программного проекта.
Поскольку ничто не дается даром, за это часто приходится платить усложнением программного кода и ухудшением производительности, поэтому применять паттерны следует только в тех случаях, когда гибкость действительно необходима.
Впрочем, практически любой сколько-нибудь успешный программный продукт требует сопровождения, модификации и, следовательно, перепроектирования.
