Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

GrandM-Patterns_in_Java

.pdf
Скачиваний:
95
Добавлен:
14.03.2016
Размер:
8.88 Mб
Скачать

Глава 1. Введение в шаблоны проектирования lE

Вас не должно обескураживать то, что вы не распознали шаблон по имени и си·

нопсису. Внимательно прочтите остальную часть описания шаблона и попы· тайтесь понять его.

КОНТЕКСТ

Здесь описывается проблема, для решения которой предназначен шаблон. ДЛJ большинства шаблонов проблема представлена в виде конкретного примера После описания проблемы предлагается ее решение.

МОТИВЫ

Здесь приводятся соображения с целью выработки основного решения, пред ставленного в разделе «Решение». Кроме того, здесь могут быть указаны причи ны, по которым решение не используется:

©- таким символом обозначены причины, лежащие в основе использовани:

решения;

®- этим значком помечаются причины отказа от применения решения.

РЕШЕНИЕ

Данный раздел - основная часть шаблона. Здесь описывается универсально решение проблемы, которое предоставляет шаблон.

РЕАЛИЗАЦИЯ

В данном разделе описываются важные соображения, которые нужно учиты

вать при использовании решения. Здесь могут быть описаны также некоторы

широко распространенные или упрощенные варианты решения.

СЛЕДСТВИЯ

Здесь объясняются последствия, хорошие и плохие, являющиеся результато

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

©- положительные следствия;

- нейтральные;

® - отрицательные.

ПРИМЕНЕНИЕ В JAVA API 1

Если в ядре Java АР! есть соответствуюший пример использования шаблона,

16 Глава 1. Введение в wаблоны проектирования

ПРИМЕР КОДА

Данный раздел содержит пример исходного кода, демонстрирующего реализа­

цию проекта, который использует шаблон. В большинстве случаев это проект,

описанный в разделе « Контекст» .

ШАБЛОНЫ С ДАННЫМ

ПРОЕКТИРОВАНИЯ,

СВЯЗАННЫЕ

ШАБЛОНОМ

 

В этом разделе приводится список шаблонов проектирования, связанных с опи­ сываемым шаблоном.

Краткая история шаблонов проектирования

Идея шаблонов проектирования первоначально возникла в архитектуре. Архи­ тектор Кристофер Александер написал две революционные книги, содержащие описание шаблонов в строительной архитектуре и городском планировании: «А Pattern Language: Towns, BuiIdings, Constructions» (Oxford University Press, 1977) и «The Timeless Way of Building» (Oxford University Press, 1979). Идеи,

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

В1987 году Уард Каннингэм и Кент Бек использовали некоторые идеи Алек­ сандера для разработки пяти шаблонов при проектировании интерфейса поль­ зователя (user interface, Ul). Они опубликовали статью « Using Pattern Languages for Object-Oriented Programs», посвященную шаблонам при проектировании интерфейса пользователя, в 00PSLA-87.

Вначале 1990-х годов Эрих Гамма, Ричард Хелм, Джон Влиссидес и Ральф

Джонсон начали работу над книгой «Design Patterns» - одной из наиболее вы­ дающихся книг того десятилетия в компьютерной области. Опубликованная

в1994 году книга популяризировала идею шаблонов. Книгу «Design Patterns»

часто называют «Gang of Four» (GoF).

Эта книга представляет собой второе издание, в которое включены некоторые

дополнительные шаблоны. Шаблоны были усовершенствованы на основе пред­ ложений читателей первого издания. Кроме того, были переработаны примеры

с учетом изменений в языке Java.

Книга «Шаблоны проектирования в Java» отражает эволюцию шаблонов и объ­ ектов со времени опубликования книги GoF, в которой примеры написаны на

языках С++ и Smalltalk. В данной книге используется язык Java, и почти все

объекты рассматриваются с точки зрения Java. При написании книги «Gang ofFoUf» UML (Unified Modeling Language, унифицированный язык моделиро­ вания) еще не существовал. Сейчас он получил широкое распространение как самый популярный язык для объектно-ориентированного анализа и проекти-

Глава 1. Введение в шаблоны проектирования 1

Структура книги

Эта книга посвящена шаблонам проектирования, которые используются

микроархитектурном уровне.

она начинается с описания средств языка UML. Глава 3 содержит обзор жи:

ненного цикла ПО и знакомит читателей с контекстом использования шабл<

нов. далее в этой главе описывается общий пример применения шаблоно

В остальных главах рассматриваются различные типы шаблонов.

Сайт http://mgrand.home.mindspring.com содержит синопсис шаблонов и Прl

меры исходных кодов, включенных в данную книгу.

Представленные здесь примеры кода написаны на языке Java, версия 1.4.

ГЛАВА

Обзор UML

UML (Unified Modeling Language, унифицированный язык моделирования) -

это система обозначений, которую можно применять для объектно-ориентиро­

ванного анализа и проектирования. Данная глава содержит краткий обзор UML, в ходе которого можно ознакомиться как с подмножеством, так и с рас­ ширениями UML, используемыми в книге. Полное описание UML можно найти на сайте http://www.omg.org/technology/documents/formal/uml.html.

В юшгах о UML некоторые данные, хранящиеся в экземплярах класса, называются атрибутами; а операциями называется инкапсулированное поведение классов. Такие термины не связаны с конкретным языком реализации. В этой книге предполагается, что в качестве языка реализации вы используете Java. Кроме того, в книге применяется в основном не нейтральная терминология, менее знакомая программирующим на Java, а связанная с Java. Например, слова «(атри­ буг» и (теременная» - взаимозаменяемые, причем предпочтение отдается харак­ терному для языка Java термину «(переменная». Взаимозаменяемыми являются здесь также слова «(операция» И «(метод», но предпочтение отдается термину «метод».

UML определяет ряд диаграмм различного вида. Они описаны в этой главе. Если у вас есть опыт объектно-ориентированного проектирования, вам пока­ жется знакомой большая часть понятий, лежащих в основе системы обозначений UML. Если в какой-либо другой главе некоторые понятия окажутся незнакомы­ ми, то вам достаточно возвратиться к этой главе.

Диаграмма классов

Диаграмма классов - это диаграмма, на которой показаны классы, интерфейсы и отношения между ними. Главный элемент диаграммы классов - класс.

На рис. 2.1 приведен пример класса и его характеристики, которые могут ото

бражаться на диаграмме классов.

Классы изображаются в виде прямоyroльников, обычно разделенных на две или три части. Прямоугольник класса на рис. 2.1 разделен на три части. В верх­ ней части находится имя класса. Средняя часть содержит список перемеННЫ;"А\ класса, а нижняя часть - методы класса.

Символы, указанные перед КаЖдой переменной и каждым методом. представ ляют собой индикаторы видимости (visibility indicators). Возможные индикато­ ры видимости и их значения содержатся в табл. 2.1.

se tLength ( length:int)

Глава 2. Обзор UML 21

Если метод ничего не :юзврашает, то в UML из сигнатуры) метода убирается

:returnType, как у метода stop на рис. 2.1.

Формальные параметры (formal parameters) метода состоят из имени и типа:

Если метод имеет несколько параметров, то они отделяются друг от друга запятой:

setPos ition ( x:int , y:int)

Упомянутый выше класс содержит два метода, перед которыми указано слове в угловых кавычках, например:

«cons t ructor»

На схемах UML слово, заключенное в угловые кавычки, называется стереоти· nом. Стереотип описывает то, что за ним следует. Стереотип const ructor ука· зывает на то, что следуюшие за ним методы представляют собой конструкторы Стереотип misc указывает, что следуюшие за ним методы - регулярные.

Последний элемент, изображенный в классе на рис. 2. 1, представляет собой элТС· липсис (...). Если в нижней части прямоугольника класса указан эллипсис, класс имеет дополнительные методы, которые на диаграмме не обозначены Если эллипсис находится в средней части класса, то класс имеет дополнитель· ные переменные, не показанные на диаграмме.

Как правило, нет необходимости (или просто неудобно) показывать стольке деталей класса, как на рис. 2. 1. Изображение класса может состоять только и: двух частей (рис. 2.2). В таком случае верхняя часть содержит имя класса а нижняя - методы. Переменные класса при этом просто не показаны. Это н( означает, что класс их не имеет.

AudioClipManager

«constructof» -АudiоСliрМапаgеrО «misc»

+getInstance():AudioClipManagery

+pla (:AudioClip) +loop(:AudioClip) +stopO

Рис. 2.2. Класс, состоящий из двух частей

Как у методов, так и у переменных могут отсутствовать индикаторы видимости

Если метод или переменная изображены без индикатора видимости, то это озH

начает отсутствие указания видимости метода или переменной. При этом

I

Сигнатура метода - это комбинация его имени и формальных параметров.

22 Глава 2. Обзор UML

подразумевается, что методы или переменные являются открытыми (public).

зашишенными (protected) или закрытыми (private).

Параметры метода могут быть опушены, если возврашаемые ими переменные

не указаны. Например, у класса на рис. 2.3 отсутствуют ИНдикаторы видимости

и параметры методов.

AudioClipManager

-iпstil[:!!;;!:;АudiQ ,,iМа[Jilg!:[ -рrevСliр:Аudiосliр

«constructon) AudioClipManager «misc»

getInsta[Jce play

[оор stop

...

Рис. 2.3. Упрощенная схема класса

На рис. 2.4 представлена простейшая схема класса, состояшая только из одной части, содержашей имя класса. Такое упрошенное представление просто иден­ тифицирует класс. В этом представлении отсутствует информация о перемен­ ных и методах класса.

AudioClipManager

Рис. 2.4. Схема класса, состоящая из одной части

Интерфейсы изображаются так же, как классы. Единственное отличие состоит в том, что перед указанным в верхней части именем указан стереотип interface

(рис. 2.5).

На рис. 2.6 показан абстрактный класс Product, являюшийся суперклассом

для класса ConcreteProduct. Написание имени класса курсивом говорит

о том, что этот класс - абстрактный. Абстрактные методы класса также въше­

лены курсивом.

Линии на рис. 2.6 указывают на взаимосвязь между классами и интерфейсом.

Сплошная линия со стрелкой в виде замкнутого контура (как линия на рис. 2.7)

указывает на то, что данный подкласс наследуется от суперкласса.

Сушествуют линии, указываюшие, что класс реализует интерфейс. В этом слу­

чае используется пунктирная или штрих-пунктирная линия со стрелкой в виде замкнутого контура (рис. 2.8).

Product *

operationl operation2

ConcreteProduct

operationl operationZ

*

.....Создает

Глава 2. Обзар UML 2

«interface» AddressIF

getAddressl setAddressl getAddressZ setAddressZ getCity setCity getState setState getPostaLCode setPostaLCode

Рис. 2.5. Интерфейс

Использует

1

CreationRequestor

newDocument

 

 

 

...

 

создатель

Запрашивает создание

1 I инициато

 

l 0••*

 

 

запроса

 

«interface»

 

 

 

 

FactoryIF

 

 

 

createProduct

*'

I

I

I

Factory

1

createProduct

Рис. 2.6. Диаграмма классав

Рис. 2.7. Подкласс наследуется

Рис. 2.8. Класс реализует

ат суперкласса

интерфейс

24 Глава 2. Обзор UML

На рис. 2.6 изображен класс Factory, реализующий интерфейс FactoryIF.

Другие линии отображают иные типы отношений между классами и ин­ терфейсом. В UML отношения такого типа называются ассоциациями. Вместе

с ассоциациями могут указываться некоторые данные, представляюшие ин­

формацию о сути ассоциации. Хотя следуюшие элементы не являются обяза­

тельными, но в данной книге они используются в тех случаях, когда это имеет

смысл.

Имя ассоциации. Примерно в середине ассоциации может быть указано ее имя,

которое всегда начинается с заглавной буквой. В конце или в начале имени ас­

социации может быть изображен треугольник. Он указывает направление, в ко­

тором следует читать ассоциацию.

Создает

 

Factory

Например, на рис. 2.6 изображена ассоциация

между классами

 

 

и ConcreteProduct.

 

 

 

 

Стрелки навиraцииСтрел.

ки на концах ассоциаций называются стрелками навига­

ции. Они указывают направление перемешения по ассоциации.

Взглянув на ассоциацию Создает (рис. 2.6), можно увидеть, что стрелка нави­ гации направлена от класса Factory к классу ConcreteProduct. Принимая

во внимание принципы создания объектов, кажется очевидным указание ответственности класса Factory за создание экземпляров объектов класса

ConcreteProduct.

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

Имя роли. Для описания смысла ассоциации имя роли, которую каждый класс играет в ассоциации, может быть указано на любом конце ассоциации, бли­

жайшем к соответствуюшему классу. Имена ролей всегда записывают строчны­

ми буквами. Это позволяет легко отличать их от имен ассоциаций, всегда начи­

наюшихся с заглавной буквы.

диаграмма классов, изображенная на рис. 2.6, содержит класс ЗапрашиваетCreationRequestorсоздание.

и интерфейс FactoryIF, которые участвуют в ассоциации инициатор запроса.

Класс CreationRequestor участвует в ассоциации в создательроли .

Интерфейс FactoryIF участвует в ассоциации в роли

Индикатор множественности. Другая часто встречаюшаяся характеристика ассо­ циации сообшает о том, сколько экземпляров каждого класса участвуют в ассо­

циации. Индикатор множественности, содержаший такую инФормацию, может

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

(наприо мер, О или 1) или диапазон чисел, который обозначается примерно так:

. . 2

Звездочка, используемая вместо верхней границы диапазона, означает неогра­ ниченное количество случаев. Индикатор множественности 1..указывает по крайней мере на один экземпляр, О..- на любое количество экземпляров.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]