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

GrandM-Patterns_in_Java

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

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

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

На рис. 2.9 представлена диаграмма классов, на которой показан класс с мно­ жеством подклассов.

Рис. 2.9. Несколько стрелок наследования

Хотя рис. 2.9 справедлив, UML позволяет использовать более приятный с эсте­ тической точки зрения способ изображения класса с множеством подклассов. Как показано на рис. 2.10, стрелки можно объединять. По смыслу рис. 2.10 ни­ чем не отличается от диаграммы, представленной на рис. 2.9.

РИС. 2.10. Одна стрелка наследования

Иногда может возникнyrь необходимость большей структуризации, чем на схе­

мах, простым соотношением «один ко многим ). Соотношение «один ко мно­ гим), в котором один объект содержит набор других объектов, называется агре­ гацией. На агрегацию указывает контур в виде ромба, расположенный на том конце ассоциации, который стыкуется с классом, содержащим экземпляры

другого класса (рис. 2.11).

 

 

Управляет

••

 

 

 

 

 

 

___----J

MessageManager

 

 

 

MIMEMsg

 

.

---':....;;.;;,:-----.;.;;.;.;;.; О * L

....--

 

Рис. 2.11. Агрегация

На рис. 2.11 изображен класс Mes sageManager. Каждый его экземпляр содер­

жит ноль или более экземпляров класса MIMEMsg.

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

в UML можно использовать еще одно обозначение, указывающее на более

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

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

в какой-то момент времени агрегируемые экземпляры должны принадле­

жать только одному составному объекту; некоторые операции должны передаваться по наследству от составного объек­

та к его агрегируемым экземплярам. Например, если составной объект кло­ нируется, то обычно клонируются и его агрегируемые экземпляры, поэтому

получившийся составной объект обладает собственными клонами исход­ ных агрегированных экземпляров.

На рис. 2. 12 представлена диаграмма классов, содержащая композитную агре­

гацию. Объекты класса Document могут содержать объекты класса Paragraph,

которые могут иметь в своем составе объекты класса DocChar. Благодаря ком­

позитной агрегации очевидно, что объекты класса Paragraph не используют совместно объекты класса DocChar, а объекты класса Document не используют совместно объекты класса Paragraph.

I

I

I

Document

0..*

Paragraph

4

0.• *

DocChar

J

I

I

Рис. 2.12. Композитная агрегация

Некоторые ассоциации являются косвенными. Вместо прямого связывания

классов друг с другом они связываются косвенно через третий класс. Рассмот,

рим диаграмму классов, представленную на рис. 2.13.

Ассоциация показывает, что экземпляры класса Cache ссылаются на экземпля­ ры класса Object через экземпляр класса Obj ec t I D.

На диаграмме классов эллипсис может иметь значение, отличное от показан­

ного на рис. 2.2. На некоторых диаграммах нужно указать, что класс имеет

большое или неопределенное множество подклассов, показывая при этом только несколько подклассов в качестве характерного примера (рис. 2. 14).

Класс DataQuery имеет подклассы JDBCQuery, OracleQuery, SybaseQuery

и неопределенное количество других классов, которые обозначены эллипсисом.

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

 

 

 

 

 

 

 

 

 

 

 

 

Cache

 

 

 

 

addObject( Object)

 

 

 

 

fetchObject( ObjectID)

 

 

 

 

 

1

)

 

 

 

 

 

 

 

 

 

 

 

 

-

--

 

Кэш

ируеТ.....

 

- ----

 

 

 

ObjectlD -- ---

 

 

о....

 

 

 

 

I

 

Object

J

 

Рис. 2.13. Класс ассоциации

DataQuety

Рис. 2.14. Неопределенное количество подклассов

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

гой класс или интерфейс, и это взаимодействие отражается на диаграмме. Воз·

можны таюке зависимости других видов. Для указания зависимости более об·

щего вида используется пунктирная линия. Пример подобной заВИСИМОСТJ представлен на рис. 2.15.

Содержит

в себе

«iпtеrfасе»

BusiпеssСLаsslPersisterIF

Рис. 2.15. Зависимость

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

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

как большой прямоугольник с маленьким прямоугольником наверху, в котором

указывается имя пакета (рис. 2.]6).

Использует

1

I ServiceProxy 1, 1

ServicePackage

J

10'

создает

,

1

1

I

«interface»

I

I

-SеrviсеНеlреr1

I

+ServiceIF

 

*

 

 

Использует

 

т

 

II

I

1

*

 

I

 

 

 

 

I

 

1, 1

Использует

*

 

+Service

 

I

 

 

 

I

-SеrviсеНеlреr2

Рис. 2.16. Пакет

На рис. 2.]6 показан пакет с именем ServicePackage. Перед именем класса или интерфейса, который находится внугри пакета, может указываться индика­ тор видимости. Открытые классы доступны для классов за пределами пакета, закрытые - нет.

Иногда при проектировании обнаруживаются обстоятельства, непонятные без комментария на диаграмме. В UML комментарий изображается в виде прямо­ угольника с загнутым правым верхним углом. С помощью сплошной линии

комментарии присоединяются к тому элементу диаграммы, к которому они от­ носятся (рис. 2.17).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

«interface»

 

 

 

 

 

 

 

 

 

 

 

 

 

Serialiable

 

 

 

 

 

 

 

 

 

 

 

 

 

f>.

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

I

...

 

 

I

 

 

I--------------------------------L------------------------

 

 

I

p

 

 

 

 

 

 

 

 

I

 

 

II

GameModel

 

 

 

 

 

 

II

 

 

I

 

 

статическM;t"to"M.mentoий класс--член'"класса,акры '

 

 

I

 

 

IIII

 

 

 

 

III

 

 

I

 

 

 

 

 

 

 

 

I

 

I

 

 

I

 

 

 

 

 

 

 

 

 

III

 

«static»

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

GameModel

 

I

MilestoneMemento I

 

 

 

 

 

 

 

 

 

 

класс-член

 

 

 

 

createMemento(description:String):М;lestoneMementoIF

 

 

 

 

 

 

 

 

setMemento(:MilestoneMementoIF)

 

 

 

Явл

яется закрытым классом

 

-членом зтого класса

т

объявляющий

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

класс

 

 

 

 

 

 

 

 

 

 

 

 

 

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

так же как объект - это экземпляр класса. Связи могуг иметь имена ассоциа­

ций, стрелки навигации и почти все остальные атрибуты, характерные мя ас­

социаций. Но поскольку связь представляет собой соединение двух объектов, то

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

Особым видом диаграмм класса считаются диаграммы объектов, содержащие

только объекты и связи (рис. 2.20).

 

: :ConcreteComDos;tel I

Содержит

....Содержит

....Содержит

I;CQncrgteCQml!Qnent2 1

Содержит....

I:cOnl:;retI:CQmI!Onl:nt2 1

I ;CQnl:;rgtgCQmI!Q ;tI:2 !

I

СодержиТ....

r

! ;CQn,rl:!eCQ!DI!Qnl:ntl, I

!;Conl:;retgcomI!Qngntl !

Содержит....

I ;CQnl:;l1tccomI!Qnen!ll

Рис. 2.20. Диаграмма объектов

Диаграмма взаимодействия

Диаграммы классов и объектов описывают соотношения между классами

и объектами. Кроме того, они предоставляют информацию о взаимодействиях

между классами. Они не показывают последовательность осуществления этих

взаимодействий, а также возможную их параллельность.

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

последовательности и параллельности МЯ каждого взаимодействия (рис. 2.21).

С одной связью может ассоциироваться любое количество взаимодействий.

Каждое взаимодействие предусматривает вызов метода. Рядом со взаимодейст­

вием или их группой располагается стрелка, указывающая на объект, метод ко­

торого вызывается. Полный набор объектов и взаимодействий представлен на

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

Обозначение каждого из представленных на рис. 2.21 взаимодействий начина­ ется с порядкового номера и двоеточия. Порядковые номера описывают после­

довательность обращений к методам. Взаимодействие с номером 1 должно про­ исходить перед взаимодействием с номером 2 и т.д.

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Глава 2.

Обзор UML 31

 

 

 

 

 

 

 

 

 

1.2: send()

 

 

 

 

 

 

 

 

 

I outMsg:OutЬoundMessageIE I---------,

 

 

 

l:receive(msg:MIMEMsg)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1I

:MessageManager

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.2: to(:String)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.3: from(:String)

 

 

 

 

 

 

 

 

 

 

 

 

1.1.4: plainText(:String)

 

 

 

 

 

 

 

 

 

builder:MAPIBuilder 11I

 

 

 

:MIMEParser

I

-----------1'I

 

 

 

 

1'·'·':

 

 

..

 

 

L....---

 

т----....J

 

 

 

 

 

 

 

 

 

 

 

Ь"f е"

etlnstще(tО

 

п

 

 

.........-,

 

 

 

 

 

 

 

г_

:_St_ri_

g)_

 

 

 

 

 

 

 

 

 

 

 

I

 

MessageBuilder

I

Рис. 2.21. Диаграмма взаимодействия

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

к методам. Часть составного порядкового номера, расположенная слева от са­

мой правой точки, называется его nрефuксом. Например, префикс номера

1.3.4 - 1 .3. то

Взаимодействия, имеющие составной порядковый номер, происходят в время,

когда метод вызывается другим взаимодействием. Этот вызов метода задается

префиксом взаимодействия. Таким образом, взаимодействия с номерами 1 . 1

и 1 .2 вызывают методы в то время, когда происходит вызов метода взаимодей­

ствием номер 1 . Аналогичным образом взаимодействия с номерами 1 . 1 . 1, 1 . 1 .2,

1 . 1 .3 и т.д. происходят во время вызова метода взаимодействием номер 1 . 1 .

Во взаимодействиях с одинаковым префиксом последовательность вызова ме­

тодов задается цифрой, следующей за префиксом. Поэтому методы взаимодей­

ствий с номерами 1 . 1. 1, 1 . 1.2, 1 . 1 .3 и т.д. вызываются именно в таком порядке.

Как было упомянуто ранее, связи представляют собой соединение двух объек­

тов, поэтому связи не могут иметь индикаторов множественности. Связи удоб­

но применять в тех случаях ассоциаций между объектами, когда количество

объектов известно. Ассоциации с индикатором множественности в виде звез­

дочки на одном из концов указывают на неограниченное количество объектов.

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

Для ассоциаций такого рода нельзя показать неопределенное количество свя­

зей, указывающих на неопределенное количество объектов. В UML дЛЯ этого

используется символ - мультиобъект. Мульmuобъе"m представляет неограни­ ченное число объектов. Он изображается в ВИде прямоугольника, находящего­ ся позади другого прямоугольника (рис. 2.22).

 

 

 

 

 

 

 

 

 

l'

 

 

 

 

 

1: notify(o)

 

 

 

 

1.1: notify(o)

 

 

 

 

 

 

 

 

 

ojObservableIF

 

 

 

 

jMulticaster

 

·L. j=ЬО

=sе=rv=еrI :F..---

1

 

 

 

 

 

Рис. 2.22. мультиобъект

На этой диаграмме взаимодействия изображен объект Obs ervableIF, вызы­

вающий метод noti fy объекта Multicaster. Реализация метода not i fy объ­ екта Mul ticaster вызывает метод notify у нескольких связанных с объектом Multicaster объектов ObserverIF, количество которых не определено.

Объекты, созданные в результате взаимодействия, могут помечаться свойством {new}. Временные объекты, которые существуют}. только во время взаимодей­ ствия, отмечены свойством {trans ient I На диаграмме взаимодействия, изо­

браженной на рис. 2.23, представлено взаимодействие, создающее объект.

1: receive(msg:MIMEMsg)

:MessageManager

 

1-----'

 

1.2: sendO

г-----------,

QutMsq:OutboundMessageIF {new}

1.1: '""',' :-р.",(m,,:МIМЕМ,,) 1

 

:MIMEParser

Рис. 2.23. Новый объект

Некоторые взаимодействия происходят не последовательно, а параллельно. Бу­

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

взаимодействия. Например, методы взаимодействий с номерами 2.2а и 2.2Ь вы­ зываются параллельно, и каждый вызов выполняется в отдельном потоке. Рас­

смотрим диаграмму взаимодействия (рис. 2.24).

в UML и Java слово «transient) (временный) используется по-разному. В Java оноUMIоз· начает, что переменная не является частью постоянного состояния объекта. В

этим словом обозначается объект, имеющий ограниченное время жизни.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

33

I :EM

ailSender I

 

 

 

 

 

 

 

 

 

I

 

 

I

 

1.3: sendMsg(e:encryptedMsg)

 

 

:Ke!lManagcr

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

1: encryptMsg(pLainText:MimeMsg)

 

:EMaiLEncrypter :

 

1.2Ь: getKey(to:String)

 

 

 

 

..

 

 

 

 

 

II

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.4:Ь..1:

 

 

 

 

 

 

 

 

 

 

 

 

 

1.'" ..11"'teMIMEStru,,,,,,,O

 

 

 

LogMessageReceipt(pLainText:MimeMsg)

 

 

 

 

 

 

 

 

 

 

LogMessageSent(e:'EncryptedMsg)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

cr I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

;MimcP

 

 

 

 

L

 

J

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 2.24. Шифрование электронной почты

Orметим, что номер взаимодействия самого верхнего уровня - 1. Во время этого взаимодействия сначала активизируется взаимодействие 1.1. Затем одновременно активизируются взаимодействия 1.2а и 1 .2Ь. Далее по порядку вызываются взаимодействия 1 .3 и 1.4.

Звездочка, изображенная сразу за порядковым номером, указывает на повто­ ряющееся взаимодействие.

Взаимодействие, изображенное на рис. 2.25, начинается с вызова метода start объекта Tol lBooth. Этот метод выполняет повторяющиеся вызовы мето­ да collectNextTol l объекта. Каждое обрашение к методу co llectNextToll

вызывает метод co l l ectTo l l объекта Tol lBas ket и метод rai s eGate объекта

Tol lGate.

1.1*: coLlectNextToll()

«self»

1 .1.1: collectToll()

 

1.1.2: raiseGateO

 

 

 

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

При рассмотрении данной диаграммы взаимодействия следует отметить еще

один момент - стереотип «se l f», расположенный рядом со связью взаимо­

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

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

осуществляется при выполнении некоторых условий. UML позволяет указы­ вать такие условия в квадратных скобках перед двоеточием. На рис. 2.26 пока­

зан пример условного повторяющегося взаимодействия, в ходе которого объект

Iterator переда я методу refresh объекта DialogMediator . Его метод refresh,

в свою очередь, вызывает метод reset объекта Widget , а затем периодически

вызывает метод addData этого объекта до тех пор, пока метод hasNext объекта Iterator возвращает true.

 

 

 

 

 

., rehesh(d""lte",.,)

1

 

 

 

 

 

 

 

 

 

 

 

 

г----

 

.........-----,

 

 

 

 

I

:DiaLogMediator

I

 

1 ..., "5О'()

 

 

 

 

 

'.2· [d"'.h"N,,,()), ,ddD'ta[d,".getN,,,()) 1

 

I

 

 

 

 

 

I

 

 

 

 

 

 

 

 

Рис. 2.26. Обновление

Обратите внимание, что UML не задает точное значение условий, связанных

с повторяющимися взаимодействиями. Спецификация UML сообщает, напри­

мер, что находящаяся в квадратных скобках информация может «(быть выраже­ на при помощи псевдокода или реального языка программирования». В данной

книге для этой цели везде используется язык программирования Java.

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

после метода:

{concur rency = sequential}

Это значит, что в какой-то момент времени только один поток долженTO f вызы­ вать метод. Никто не гарантирует правильное поведение метода в случае,

если в определенный момент времени метод вызывается несколькими потока­ ми одновременно.

(concurrency = concurrent )

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