Каталог паттернов проектирования (GoF)

В области разработки программных систем существует множество паттернов, которые отличаются областью применения, масштабом, содержимым, стилем описания. Например, в зависимости от сферы применения существуют такие паттерны, как паттерны анализа, проектирования, тестирования, документирования, организации процесса разработки, планирования проектов и др.

В настоящее время наиболее популярными паттернами являются паттерны проектирования. Одной из распространенных классификаций таких паттернов является классификация по степени детализации и уровню абстракции рассматриваемых систем. Согласно [21 паттерны проектирования программных систем делятся на следующие категории:

  • 1) архитектурные паттерны;
  • 2) паттерны проектирования;
  • 3) идиомы.

Архитектурные паттерны, являясь наиболее высокоуровневыми паттернами, описывают структурную схему программной системы в целом. В данной схеме указываются отдельные функциональные составляющие системы, называемые подсистемами, а также взаимоотношения между ними. Примером архитектурного паттерна является хорошо известная программная парадигма «модель—представление-контроллер» (model—view—controller — МУС).

В свою очередь, подсистемы могут состоять из архитектурных единиц уровнем ниже. Паттерны проектирования описывают схемы детализации программных подсистем и отношений между ними, при этом они не влияют на структуру программной системы в целом и сохраняют независимость от реализации языка программирования. Паттерны GoF относятся именно к этой категории. Согласно [54J под паттернами проектирования объектно-ориентированных систем понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи проектирования в конкретном контексте.

Идиомы, являясь низкоуровневыми паттернами, имеют дело с вопросами реализации какой-либо проблемы с учетом особенностей данного языка программирования. При этом часто одни и те же идиомы для разных языков программирования выглядят по-разному или не имеют смысла вовсе. Например, в C++ для устранения возможных утечек памяти могут использоваться интеллектуальные указатели. Интеллектуальный указатель содержит указатель на участок динамически выделенной памяти, который будет автоматически освобожден при выходе из зоны видимости. В среде Java такой проблемы просто не существует, так как там используется автоматическая сборка мусора. Обычно для использования идиом нужно глубоко знать особенности применяемого языка программирования [2].

Следует отметить, что в программной области существуют и другие виды паттернов, не относящиеся к проектированию вообще, например паттерны анализа, тестирования, документирования и др.

Каталог паттернов проектирования (GoF) содержит 23 паттерна. Паттерны проектирования различаются степенью детализации и уровнем абстракции, и их можно разделить на две группы (табл. 5.1). Первая — уровень класса, вторая — объекта.

Таблица 5.1

Цель

Уровень

Порождающие

паттерны

Структурные

паттерны

Паттерны

поведения

Класс

(Фабричный метод) Factory Method

Адаптер (Adapter)

Интерпретатор

(Interpreter).

Шаблонный метод (Template Method)

Объект

Абстрактная

фабрика

(Abstract Factory). Строитель (Builder). Прототип (Prototype). Одиночка (Singleton)

Адаптер (Adapter). Декоратор (Decorator). Заместитель (Proxy). Компоновщик (Composite).

Мост (Bridge).

П риспособленец (Flyweight).

Фасад (Facade)

Итератор (Iterator). Команда (Command). Наблюдатель (Observer). Хранитель (Memento). Стратегия (Strategy). Состояние (State). Посредник (Mediator). Посетитель (Visitor). Цепочка обязанностей (Chain, of Responsibility)

В свою очередь, каждая группа делится на порождающие паттерны, структурные паттерны и паттерны поведения. Первые связаны с процессом создания объектов. Вторые имеют отношение к композиции объектов и классов. Паттерны поведения характеризуют то, как классы или объекты взаимодействуют между собой.

Паттерны уровня классов описывают отношения между классами и их подклассами. Такие отношения выражаются с помощью наследования, и поэтому они статичны, т. е. эти отношения зафиксированы на этапе компиляции.

Паттерны уровня объектов описывают отношения между объектами, которые могут изменяться во время выполнения программы, и потому более динамичны. Почти все паттерны в какой-то мере используют наследование. Поэтому к категории «паттерны классов» отнесены только те, что сфокусированы лишь на отношениях между классами. Обратите внимание: большинство паттернов действуют на уровне объектов.

Порождающие паттерны классов частично делегируют ответственность за создание объектов своим подклассам, тогда как порож-

Строитель

т

Хранитель

создание составных объектов

перечисление потомков

сохранение состояния иг

добавление новых обязанностей объекту

?

Декоратор

совместное использование составных объектов

і______

Заместитель

Приспособленец

измоиоиио облика, в не внутреннего устройства

совместное использование стратегий

определение

грамматики

Интерпретатор

совместное использование терминальных символов

Мост

ИЭбОЖАНИО

запаздывания

Компоновщик

определение

добавление операций

Посетитель

добавление

операций

определение

цепочки

Цепочка обязанностей

Стратегия

совместное

использование

состояний

Посредник

управление сложным зависимостями

Состояние

определение шагов алгоритма

Шаблонный метод

прочно

применения

Прототип

динамическое конфигурирование * "^фабрики_

реализация-

і

Фабричный метод

Абстрактная фабрика

_с /юмосцью

единственный

экземпляр

Одиночка

единствен экземпляр

Фасад

Рис. 31. Отношения между паттернами

дающие паттерны объектов передают ответственность другому объекту. Структурные паттерны классов используют наследование для составления классов, в то время как структурные паттерны объектов описывают способы сборки объектов из частей. Поведенческие паттерны классов используют наследование для описания алгоритмов и потока управления, а поведенческие паттерны объектов описывают, как объекты, принадлежащие некоторой группе, совместно функционируют и выполняют задачу, которая ни одному отдельному объекту не под силу.

Существуют и другие способы классификации паттернов. Некоторые паттерны часто используются вместе. Например, Компоновщик применяется с Итератором или Посетителем. Некоторыми паттернами предлагаются альтернативные решения. Так, прототип можно использовать вместо абстрактной фабрики. Применение части паттернов приводит к схожему дизайну, хотя изначально их назначение различно. Например, структурные диаграммы Компоновщика и Декоратора похожи. На рис. 31 показана диаграмма связей между паттернами при их совместном использовании при построении архитектуры ПО.

 
< Пред   СОДЕРЖАНИЕ     След >