Uploaded by Inigo Separator

Паттерны проектирования

advertisement
ВВЕДЕНИЕ .............................................................................................................. 3
ГЛАВА1.СУЩНОСТЬ ОПРЕДЕЛЕНИЯ ШАБЛОНОВ ПРОЕКТИРОВАНИЯ
................................................................................................................................... 4
ГЛАВА
2.
ОСНОВНЫЕ
ТИПЫ
ШАБЛОНОВ
ПРОЕКТИРОВАНИЯ………………………………………..………………..…..9
2.1 Основные шаблоны (Fundamental). ....................................................... 9
2.2 Порождающие шаблоны проектирования (Creational). ...................... 9
2.3 Структурные шаблоны (Structural). ..................................................... 11
2.4 Поведенческие шаблоны (Behavioral) ................................................. 12
2.5 Шаблоны параллельного программирования (Concurrency) ............ 12
2.6 Другие типы шаблонов. ........................................................................ 12
ЗАКЛЮЧЕНИЕ ..................................................................................................... 13
СПИСОК
ЛИТЕРАТУРЫ……………………………………………………………...……15
ВВЕДЕНИЕ
Опытные
разработчики
объектно-ориентированных
систем
сформулировали общие принципы и стандартные решения, помогающие в
разработке программного обеспечения. Если эти принципы и идиомы
систематизировать и структурировать, а также присвоить им имена, то их
можно применять в качестве шаблонов (patterns).
Многие решения в программировании уникальны. Процесс написания
программных продуктов станет более эффективным, если разработчики
будут тратить меньше времени на рутинные, повторяющиеся части своей
работы, чтобы иметь возможность более продуктивно решать действительно
уникальные проблемы. С их помощью решаются конкретные задачи
проектирования, в результате чего объектно-ориентированный дизайн
становится более гибким, элегантным, и им можно воспользоваться
повторно. Проектировщик, знакомый с паттернами, может сразу же
применять их к решению новой задачи.
Большинство программ подчиняется небольшому набору правил:
• Программы читают чаще, чем пишут.
• Разработка не может быть окончательной. Намного больше вложений
занимает не создание новых программ, а модификация старых.
• Код структурирован с помощью базового набора состояний и
управляющих методов.
• Необходимо понимать как общую концепцию, так и детали
программы.
Ограничения или факторы влияют на каждый написанный цикл в
программе. Факторы предсказуемо повторяются и являются основой того,
что возникает желание создать шаблон, поскольку это шаблон реакций на
повторяющиеся факторы. Каждый шаблон можно рассматривать с точки
зрения относительных
приоритетов факторов. Большинство шаблонов
сопровождаются краткой заметкой об альтернативных способах решения
проблемы и пояснением, почему было выбрано именно такое решение.
Раскрытие причины использования какого-то шаблона побуждает находить
способы решения повторяющихся задач. Шаблоны наводят мост между
абстрактными принципами и практикой. Шаблоны так же помогают писать
код.
Работа по шаблонам может казаться ограничивающей, но их
использование сберегает время и энергию.
Ни один набор шаблонов не будет работать во всех встречающихся
ситуациях.
Шаблоны лучше всего работают как дополнение к процессу принятия
решений
человеком. Использование шаблонов помогает программистам
находить обоснованные решения различных проблем с учетом влияющих
факторов и дает прикладные советы по созданию удовлетворительного
решения.
Результатом является более качественная, дешевая, быстрая работа над
частями программы, требующие много времени, поэтому появляется больше
времени и энергии для раздумий над более сложными задачами.
ГЛАВА
1.
СУЩНОСТЬ
ОПРЕДЕЛЕНИЯ
ШАБЛОНОВ
ПРОЕКТИРОВАНИЯ
В разработке программного обеспечения, шаблон проектирования или
паттерн (англ. design pattern) — повторимая архитектурная конструкция,
представляющая собой решение проблемы проектирования в рамках
некоторого часто возникающего контекста.
Обычно шаблон не является законченным образцом, который может
быть прямо преобразован в код, это лишь пример решения задачи, который
можно использовать в различных ситуациях. Объектно-ориентированные
шаблоны показывают отношения и взаимодействия между классами или
объектами, без определения того, какие конечные классы или объекты
приложения будут использоваться.
Шаблоны проектирования это, по сути, классы, адаптированные под
решение наиболее общих задач, а основное их предназначение - это описание
взаимодействия объектов в приложении. Если более обобщенно и
человеческим
языком,
то
это
опыт
огромного
количества
людей,
проверенный временем.
В наше время редко встретишь разработчика, который не использует
объектноориентированный подход в программировании при работе над
крупными проектами, или хотя бы не знаком с его основной концепцией.
Трудно, а порой даже не возможно, начинать серьезную работу с нуля, не
используя наработок в коде или хотя бы в проектировании. От этого у
программистов появляется потребность выделять для себя ключевые
моменты из каждого проекта и с каждым разом абстрагируясь от каких-то
конкретных требований того или иного приложения строить каркас для
будущих разработок. Это еще больше усложнит задачу. Если придется
работать в команде, людям нужно будет вникать в выработанный месяцами,
а скорее всего и годами, подход. Для этого и нужны паттерны
проектирования, без использования общепринятых методов в разработке
очень сложно построить крупный проект, ну или придется повторяться,
создавая
похожий
проект,
а
на
это
как
правило
нет
времени.
В объектно-ориентированной технологии проектирования шаблоном называют именованное описание проблемы и ее решения, которые можно
применить при разработке других систем. В идеале, шаблон должен
содержать советы по поводу его применения в различных ситуациях, а также
описание его преимуществ и недостатков. Многие шаблоны содержат
рекомендации по распределению обязанностей между объектами с учетом
специфики задачи.
Проще говоря, шаблон — это именованная пара "проблема – решение",
содержащая рекомендации для применения в различных конкретных
ситуациях, которую можно использовать в различных контекстах. Смысл
паттерна - предложить решение определенной задачи в конкретном
контексте.
Шаблоны
являются
основным
механизмом
для
накопления
и
повторного использования полезных принципов разработки программного
обеспечения.
Шаблоны не предназначены для изучения и выражения новых
принципов разработки программного обеспечения. Скорее, наоборот. Они
призваны систематизировать существующие знания, идиомы и принципы.
Чем шире они используются, тем лучше.
Паттерны
проектирования
упрощают
повторное
использование
удачных проектных и архитектурных решений. Представление прошедших
проверку временем методик в виде паттернов проектирования облегчает
доступ к ним со стороны разработчиков новых систем. С помощью паттернов
можно улучшить качество документации и сопровождения существующих
систем, позволяя явно описать взаимодействия классов и объектов, а также
причины, по которым система была построена так, а не иначе. Проще говоря,
паттерны проектирования дают разработчику возможность быстрее найти
«правильный» путь.
В общем случае паттерн состоит из четырех основных элементов:
•
Имя. Сославшись на него, мы можем сразу описать проблему
проектирования, ее решения и их последствия. Присваивание паттернам
имен позволяет проектировать на более высоком уровне абстракции. С
помощью словаря паттернов можно вести обсуждение с коллегами,
упоминать паттерны в документации, в тонкостях представлять дизайн
системы.
•
Задача. Описание того, когда следует применять паттерн.
Необходимо сформулировать задачу и ее контекст. Может описываться
конкретная проблема проектирования, например способ представления
алгоритмов в виде объектов. Иногда отмечается, какие структуры классов
или объектов свидетельствуют о негибком дизайне. Также может включаться
перечень условий, при выполнении которых имеет смысл применять данный
паттерн.
•
Решение. Описание элементов дизайна, отношений между ними,
функций каждого элемента. Конкретный дизайн или реализация не имеются
в виду, поскольку паттерн - это шаблон, применимый в самых разных
ситуациях. Просто дается абстрактное описание задачи проектирования и
того, как она может быть решена с помощью некоего весьма обобщенного
сочетания элементов (в нашем случае классов и объектов).
•
Результаты - это следствия применения паттерна и разного рода
компромиссы. Хотя при описании проектных решений о последствиях часто
не упоминают, знать о них необходимо, чтобы можно было выбрать между
различными вариантами и оценить преимущества и недостатки данного
паттерна. Здесь речь идет и о выборе языка и реализации. Поскольку в
объектно-ориентированном
проектировании
повторное
использование
зачастую является важным фактором, то к результатам следует относить и
влияние на степень гибкости, расширяемости и переносимости системы.
Преимущества шаблонов проектирования сводятся к тому, что с
помощью шаблона впоследствии можно легко расширять систему, добавляя
в нее новые вариации.
Новые реализации можно вводить без модификации клиентской части
приложения.
Можно классифицировать паттерны по двум критериям. Первый - цель
- отражает назначение паттерна. В связи с этим выделяются порождающие
паттерны, структурные паттерны и паттерны поведения. Первые связаны с
процессом создания объектов. Вторые имеют отношение к композиции
объектов и классов. Паттерны поведения характеризуют то, как классы или
объекты взаимодействуют между собой.
Второй критерий - уровень - говорит о том, к чему обычно применяется
паттерн: к объектам или классам. Паттерны уровня классов описывают
отношения между классами и их подклассами. Такие отношения выражаются
с помощью наследования, поэтому они статичны, то есть зафиксированы на
этапе компиляции.
Почти все паттерны в какой-то мере используют наследование.
Поэтому к категории «паттерны классов» отнесены только те, что
сфокусированы лишь на отношениях между классами. Обратите внимание:
большинство паттернов действуют на уровне объектов.
Порождающие паттерны классов частично делегируют ответственность
за создание объектов своим подклассам, тогда как порождающие паттерны
объектов передают ответственность другому объекту. Структурные паттерны
классов используют наследование для составления классов, в то время как
структурные паттерны объектов описывают способы сборки объектов из
частей. Поведенческие паттерны классов используют наследование для
описания алгоритмов и потока управления, а поведенческие паттерны
объектов описывают, как объекты, принадлежащие некоторой группе,
совместно функционируют и выполняют задачу, которая ни одному
отдельному объекту не под силу.
С
помощью
наследования.
паттернов
проектирования
упрощается
процесс
Два наиболее распространенных приема повторного использования
функциональности в объектно-ориентированных системах - это наследование
класса и композиция объектов. Наследование класса позволяет определить
реализацию одного класса в терминах другого.
Делегирование - использование объектом другого объекта для
реализации тех или иных функций. Шаблон делегирования (англ. delegation
pattern) — это способ, которым объект внешне выражает некоторое
поведение, но в реальности передаёт ответственность за выполнение этого
поведения
связанному
объекту.
Шаблон
делегирования
является
фундаментальной абстракцией, которая поддерживает композицию (также
называемую агрегацией).
ГЛАВА 2. ОСНОВНЫЕ ШАБЛОНЫ ПРОЕКТИРОВАНИЯ
2.1 Основные шаблоны (Fundamental).
Шаблон делегирования. В разработке ПО, шаблон делегирования
(англ. delegation pattern) — это способ, которым объект внешне выражает
некоторое поведение, но в реальности передаёт ответственность за
выполнение этого поведения связанному объекту. Шаблон делегирования
является фундаментальной абстракцией, которая поддерживает композицию
(также
называемую
агрегацией).
Этот
шаблон
обычно
затрудняет
оптимизацию по скорости в пользу улучшенной чистоты абстракции.
В шаблоне, класс С может делегировать либо классу A либо классу B.
Класс C имеет методы для переключения между классами A и B. Включение
расширения улучшает безопасность типа, потому что каждый класс должен
выполнять методы в интерфейсе. Основным недостатком является большее
количество кода.
2.2 Порождающие шаблоны проектирования (Creational).
Порождающие
проектирования,
шаблоны
которые
(англ. Creational
абстрагируют
patterns) —
процесс
шаблоны
инстанцирования.
Инстанцирование (англ. instantiation) — создание экземпляра класса. В
отличие от слова «создание», применяется не к объекту, а к классу.
Порождающие шаблоны используют полиморфное инстанцирование. Они
позволяют сделать систему независимой от способа создания, композиции и
представления
объектов.
наследование,
чтобы
Шаблон, порождающий
изменять
инстанцируемый
классы, использует
класс,
а
шаблон,
порождающий объекты, делегирует инстанцирование другому объекту.
Эти шаблоны оказываются важны, когда система больше зависит от
композиции объектов, чем от наследования классов.
Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон
проектирования, позволяющий изменять поведение системы, варьируя
создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет
создавать целые группы взаимосвязанных объектов, которые, будучи
созданными одной фабрикой, реализуют общее поведение. Шаблон
реализуется созданием абстрактного класса Factory, который представляет
собой интерфейс для создания компонентов системы (например, для
оконного интерфейса он может создавать окна и кнопки). Затем пишутся
наследующиеся от него классы, реализующие этот интерфейс. Предоставляет
интерфейс для создания семейств взаимосвязанных или взаимозависимых
объектов, не специфицируя их конкретных классов. При применении данного
шаблона система не должна зависеть от того, как создаются, компонуются и
представляются
входящие
в
нее
объекты.
Входящие
в
семейство
взаимосвязанные объекты должны использоваться вместе. Система должна
конфигурироваться одним из семейств составляющих ее объектов.
Фабричный метод (англ. Factory Method) — порождающий шаблон
проектирования, предоставляющий подклассам интерфейс для создания
экземпляров некоторого класса. В момент создания наследники могут
определить, какой класс инстанциировать. Иными словами, Фабрика
делегирует создание объектов наследникам родительского класса. Это
позволяет использовать в коде программы не специфические классы, а
манипулировать абстрактными объектами на более высоком уровне. Также
известен под названием виртуальный конструктор
2.3 Структурные шаблоны (Structural).
Структурные шаблоны определяют различные сложные структуры,
которые изменяют интерфейс уже существующих объектов или его
реализацию, позволяя облегчить разработку и оптимизировать программу.
Adapter (Адаптер) или Wrapper (Обёртка) — объект, обеспечивающий
взаимодействие двух других объектов, один из которых использует, а другой
предоставляет несовместимый с первым интерфейс. Структурный шаблон
проектирования, предназначенный для организации использования функций
объекта, недоступного для модификации, через специально созданный
интерфейс. Чаще всего применяется, если необходимо создать класс,
производный от вновь определяемого или уже существующего абстрактного
класса. Шаблон Адаптер позволяет включать уже существующие объекты в
новые объектные структуры, независимо от различий в их интерфейсах. Он
дает возможность в процессе проектирования не принимать во внимание
возможные различия в интерфейсах уже существующих классов. Если есть
класс,
обладающий
требуемыми
методами
и
свойствами,
то
при
необходимости всегда можно воспользоваться шаблоном Адаптер для
приведения его интерфейса к нужному виду.
2.4 Поведенческие шаблоны (Behavioral)
Mediator (Посредник)
– обеспечивает взаимодействие множества
объектов, сформировав при этом слабую связанность и избавив объекты от
необходимости
явно
ссылаться
друг
на
друга.
Создает
объект,
инкапсулирующий способ взаимодействия множества объектов.
2.5 Шаблоны параллельного программирования (Concurrency)
Шаблоны параллельного программирования используется для более
эффективного написания многопоточных программ, и предоставляет готовые
решения проблем синхронизации.
2.6 Другие типы шаблонов.
Также на сегодняшний день существует ряд других шаблонов:
•
Аналитические шаблоны – описывают основной подход для
составления требований для программного обеспечения (requirement analysis)
до начала самого процесса программной разработки.
•
Коммуникационные шаблоны – описывают процесс общения
между отдельными участниками (сотрудниками) организации.
•
Организационные шаблоны – описывают организационную
иерархию предприятия или фирмы.
•
Анти-паттерны (Anti-Design-Patterns). Описывают как не следует
поступать при разработке программ, показывая характерные ошибки в
дизайне и в реализации.
Анти-паттерны (anti-patterns), также известные как ловушки (pitfalls) —
это классы наиболее часто внедряемых плохих решений проблем. Они
изучаются, как категория, в случае когда их хотят избежать в будущем, и
некоторые отдельные случаи их могут быть распознаны при изучении
неработающих систем.
ЗАКЛЮЧЕНИЕ
В данной работе раскрыта тема сущности и применения шаблонов
проектирования, их структура и изучили причины, по которым возникает
необходимость использовать шаблоны.
Важно помнить, что шаблоны проектирования — это не набор готовых
решений, которые можно объединять, как компоненты, при построении
проекта.
Шаблоны
—
это
предлагаемые
подходы
к
решению
распространенных задач. В этих решениях воплощены некоторые основные
принципы проектирования. Описания паттернов структурированы таким
образом, чтобы обеспечить максимальное понимание концепции паттернов и
их использования. Для этой цели выделены и систематически, на единых
принципах
описаны
основные
группы
паттернов
проектирования,
обсуждаемые в порядке возрастания "масштаба" решаемых задач. Каждая из
этих групп описывает паттерны для решения задач определенного уровня от взаимодействия отдельных классов/обьектов системы до интеграции
нескольких информационных систем в единое целое. В соответствии с этим в
работе
описаны
информационных
паттерны
проектирования
взаимодействия
объектов
систем:
фундаментальные,
порождающие
шаблоны
проектирования, структурные шаблоны, поведенческие шаблоны, шаблоны
параллельного программирования.
Внутри вышеописанных групп паттернов проектирования проведена
своя структуризация, упрощающая поиск и понимание назначения паттернов
проектирования.
Преимущества шаблонов проектирования сводятся к тому, что с
помощью шаблона впоследствии можно легко расширять систему, добавляя
в нее новые вариации.
Паттерны проектирования позволяют разными способами решать
многие задачи, с которыми постоянно сталкиваются проектировщики
объектно-ориентированных приложений.
Рассмотрены механизмы повторного использования программного
кода
применительно
к
шаблонам
проектирования
(наследование,
композиция, делегирование). Большинству проектировщиков известны
концепции объектов, интерфейсов, классов и наследования. Трудность в том,
чтобы применить эти знания для построения гибких, повторно используемых
программ. С помощью паттернов проектирования
упрощается процесс
наследования.
приема
Два
наиболее
распространенных
повторного
использования функциональности в объектно-ориентированных системах это наследование класса и композиция объектов.
Паттерны проектирования различаются степенью детализации и
уровнем абстракции и должны быть каким-то образом организованы.
В силу ограниченного объема данной работы, а, также из-за отсутствия
в настоящее время достаточно хорошо проработанного материала по
некотором тематикам в работе не обсуждаются некоторые виды паттернов.
Это касается, например, паттернов, посвященных программной обработке
ошибок, паттернов, описывающих типовые решения при организации
распределенных вычислений, паттернов для систем реального времени и др.
СПИСОК ЛИТЕРАТУРЫ
1. Мартин Фаулер Шаблоны корпоративных приложений = Patterns of
Enterprise Application Architecture (Addison-Wesley Signature Series).
— М.: «Вильямс», 2009. — С. 544. — ISBN 0-321-12742-0
2. Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектноориентированного проектирования. Паттерны проектирования =
Design Patterns: Elements of Reusable Object-Oriented Software. —
СПб: «Питер», 2007. — С. 366. — ISBN 978-5-469-01136-1 (также
ISBN 5-272-00355-1)
3. Марк Гранд Шаблоны проектирования в JAVA. Каталог
популярных шаблонов проектирования, проиллюстрированных при
помощи UML = Patterns in Java, Volume 1. A Catalog of Reusable
Design Patterns Illustrated with UML. — М.: «Новое знание», 2004. —
С. 560. — ISBN 5-94735-047-5
4. Крэг Ларман Применение UML 2.0 и шаблонов проектирования =
Applying UML and Patterns : An Introduction to Object-Oriented
Analysis and Design and Iterative Development. — М.: «Вильямс»,
2006. — С. 736. — ISBN 0-13-148906-2
5. Джошуа Кериевски Рефакторинг с использованием шаблонов
(паттернов проектирования) = Refactoring to Patterns (AddisonWesley Signature Series). — М.: «Вильямс», 2006. — С. 400. — ISBN
0-321-21335-1
6. Скотт В. Эмблер, Прамодкумар Дж. Садаладж Рефакторинг баз
данных: эволюционное проектирование = Refactoring Databases:
Evolutionary Database Design (Addison-Wesley Signature Series). —
М.: «Вильямс», 2007. — С. 368. — ISBN 0-321-29353-3
Download