Общие сведения о шаблонах проектирования
Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения – это повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста. Обычно шаблон не является законченным образцом, который может быть прямо преобразован в код; это лишь пример решения задачи, который можно использовать в различных ситуациях. Объектно-ориентированные шаблоны показывают отношения и взаимодействия между классами или объектами, без определения того, какие конечные классы или объекты приложения будут использоваться.
«Низкоуровневые» шаблоны, учитывающие специфику конкретного языка программирования, называются идиомами. Это хорошие решения проектирования, характерные для конкретного языка или программной платформы, и потому не универсальные.
На наивысшем уровне существуют архитектурные шаблоны, они охватывают собой архитектуру всей программной системы.
Алгоритмы по своей сути также являются шаблонами, но не проектирования, а вычисления, так как решают вычислительные задачи.
Параметризованные классы
Параметризованный класс (или шаблон) представляет собой определение класса, в котором часть используемых типов компонент класса определяется через параметры. Таким образом, каждый шаблон определяет группу классов, которые, несмотря на различие типов, характеризуются одинаковым поведением. Переопределить тип в процессе выполнения программы нельзя: все операции конкретизации типа выполняются компилятором (точнее - препроцессором) C++.
Параметризованные классы реализованы в C++. Они часто используются для реализации контейнерных классов, причем обычно в качестве элемента выступает полиморфный объект, указатель на базовый класс которого и передается через параметр. Классы, полученные из такого шаблона, могут оперировать как с объектами базового класса, так и с объектами производных классов.
Пример. Шаблон классов (шаблон классов Список). Шаблон практически полностью повторяет описание класса, но везде, где должен указываться тип элемента, вместо него следует указать параметр (в нашем случае Тип_элемента):
При использовании шаблона указывается его имя и соответствующее значение параметра, например:
Список (Запись1)
или
Список (Запись2)
Реализация контейнеров в виде параметризованных классов по сравнению с обычной реализацией может оказаться более наглядной и, следовательно, предпочтительной.
В языке UML параметризованный класс обозначается как обычный класс, на правый верхний угол которого наложен пунктирный прямоугольник, содержащий список формальных параметров класса (рис. 4.1). Этот список не может быть пустым. У каждого параметра должно быть имя и классификатор, обычно представляющий тип атрибута.
Параметризованный класс, аргументы которого имеют фактическое значение, называется классом-наполнителем (instantiated class). Например, в приведенном примере, мы можем определить значение аргумента списка как списка сотрудников или списка целых чисел. В соответствии с нотацией UML, имя аргумента класса-наполнителя заключается в угловые скобки (< >): <СписокСотрудников> или <Список_целых_чисел>. Обозначение класса-наполнителя в языке UML, такое же, как и обозначение обычного класса, но вместо имени класса записывается имя аргумента класса-наполнителя в угловых скобках (рис 4.2 ).