- •А.А. Волосевич
- •3. Шаблоны и архитектура программ
- •3.1. Модульное тестирование
- •3.2. Шаблоны проектирования
- •3.3. Структурные шаблоны: Декоратор, Заместитель, мост Декоратор (Decorator)
- •Заместитель (Proxy)
- •Мост (Bridge)
- •3.4. Структурные шаблоны: компоновщик и приспособленец Компоновщик (Composite)
- •Приспособленец (Flyweight)
- •3.5. Структурные шаблоны: адаптер и фасад Адаптер (Adapter)
- •Фасад (Façade)
- •3.6. Порождающие шаблоны: прототип, фабричный метод, одиночка Прототип (Prototype)
- •Фабричный метод (Factory method)
- •Одиночка (Singleton)
- •3.7. Порождающие шаблоны: абстрактная фабрика и строитель Абстрактная фабрика (Abstract factory)
- •Строитель (Builder)
- •3.8. Шаблоны поведения: стратегия, состояние, шаблонный метод Стратегия (Strategy)
- •Состояние (State)
- •Шаблонный метод (Template method)
- •3.9. Шаблоны поведения: цепочка обязанностей и команда Цепочка обязанностей (Chain of responsibility)
- •Команда (Command)
- •3.10. Шаблоны поведения: итератор, посредник, наблюдатель Итератор (Iterator)
- •Посредник (Mediator)
- •Наблюдатель (Observer)
- •3.11. Шаблоны поведения: посетитель, интерпретатор, хранитель Посетитель (Visitor)
- •Интерпретатор (Interpreter)
- •Хранитель (Memento)
- •3.12. Некоторые неклассические шаблоны проектирования
- •Неизменный объект (Immutable object)
- •Пул объектов (Object pool)
- •Отложенная инициализация (Lazy initialization)
- •Нулевой объект (Null object)
- •3.13. Антипаттерны
- •3.14. Архитектура прогРаммного Обеспечения
- •«Клиент-сервер»
- •Архитектура, основанная на использовании компонентов
- •Многоуровневая архитектура
- •Шина сообщений
- •Выделенное представление
- •Объектно-ориентированная архитектура
- •Архитектура, ориентированная на сервисы
3.2. Шаблоны проектирования
Шаблоны (или паттерны) проектирования (design patterns) – это многократно используемые решения распространенных проблем, возникающих при разработке программного обеспечения2. По мере накопления личного опыта и профессионального роста программист обычно замечает сходство новых проблем проектирования с решёнными им ранее. В дальнейшем приходит осознание того, что решения похожих проблем представляют собой повторяющиеся шаблоны. Зная эти шаблоны, опытные программисты распознают ситуацию их применения и сразу используют готовое решение, не тратя времени на предварительный анализ проблемы.
Историю шаблонов проектирования принято начинать с книг архитектора Кристофера Александера (Christopher Alexander). В семидесятых годах двадцатого века он составил набор шаблонов для применения в строительной архитектуре и городском планировании. Однако в области архитектуры эта идея не получила такого развития, как позже в области программной разработки.
В 1987 году Кент Бэк (Kent Beck) и Уард Каннигем (Ward Cunningham) использовали некоторые идеи Александера и разработали шаблоны на языке Smalltalk для программ пользовательского интерфейса. В 1988 году Эрих Гамма (Erich Gamma) начал писать докторскую работу при цюрихском университете об общей переносимости методики Александера на разработку программ. В 1991 году Гамма заканчивает свою диссертацию и в сотрудничестве с Ричардом Хелмом (Richard Helm), Ральфом Джонсоном (Ralph Johnson) и Джоном Влиссидсом (John Vlissides) публикует книгу «Design Patterns – Elements of Reusable Object-Oriented Software»3. В книге были описаны 23 шаблона проектирования. «Design Patterns» стала причиной роста популярности шаблонов, а сами шаблоны из книги скоро начали называть классическими. В дальнейшем список шаблонов пополнялся и адаптировался для различных языков программирования.
Рассмотрим аргументы «за» и «против» применения шаблонов проектирования. Главная польза каждого отдельного шаблона состоит в том, что он описывает решение целого класса абстрактных проблем. Тот факт, что каждый шаблон имеет свое имя, облегчает дискуссию между разработчиками. Таким образом, за счёт шаблонов производится унификация терминологии, названий модулей и элементов проекта. Однако есть мнение, что слепое применение шаблонов из справочника, без осмысления причин и предпосылок выделения шаблона, замедляет профессиональный рост программиста, так как подменяет творческую работу механической подстановкой. Люди, придерживающиеся данного мнения, считают, что знакомиться со списками шаблонов следует тогда, когда программист «дорос» до них в профессиональном плане. Хороший критерий нужной степени профессионализма – выделение шаблонов самостоятельно, на основании собственного опыта. При этом, разумеется, знакомство с теорией, связанной с шаблонами, полезно на любом уровне профессионализма и направляет развитие программиста в правильную сторону.
Существует несколько способов группировки шаблонов. Ниже представлена классификация шаблонов в зависимости от назначения.
Структурные шаблоны – показывают, как объекты и классы объединяются для образования сложных структур.
Порождающие шаблоны – управляют и контролируют процесс создания и жизненный цикл объектов.
Шаблоны поведения – используются для организации, управления и объединения различных вариантов поведения объектов.