GrandM-Patterns_in_Java
.pdfГлава 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 )