578 Глава 25. Введение в OCL
Таблица 25.19
Простой пример применения шаблона Observer показан на рис. 25.24.
Семантика этого шаблона проста: субъект (Subject) имеет нуль или бо
лее наблюдателей (Observer). При изменении Subject вызывается его опе
рация notify() (уведомить), которая в свою очередь вызывает операцию
update() (обновить) каждого прикрепленного к ней Observer. Примером
обычного использования этого шаблона может быть обновление экра
на при изменении базовых бизнесобъектов.
Семантика операций Subject представлена в табл. 25.20.
Таблица 25.20
Рассмотрим возможные постусловия для операций Subject, которые
могут использовать сообщения.
Согласно табл. 25.20 постусловие Subject::notify() состоит в том, что Ob
server::update() был вызван для каждого присоединенного Observer. На
языке OCL это может быть выражено следующим образом:
context Subject::notify( )
has sent с параметрами Семантика
anObject^aMessage( 1, 2 ) Возвращает true, если aMessage(...) послано в an
Object с параметрами, имеющими значения 1 и 2.
anObject^aMessage( ?:Integer,
?:Integer )
Возвращает true, если aMessage(...) послано в an
Object с параметрами типа Integer.
get messages с параметрами Семантика
anObject^^aMessage( 1, 2 ) Возвращает Sequence всех сообщений, посланных в
anObject с параметрами, имеющими значения 1 и 2.
anObject^^aMessage( ?:Integer,
?:Integer )
Возвращает Sequence всех сообщений, посланных
в anObject с параметрами типа Integer.
Операция Subject Семантика
attach( o : Observer ) Присоединяет объект Observer.
detach( o : Observer ) Отсоединяет объект Observer.
notify() Вызывает операцию update() каждого объекта Observer –
вызывается, когда Subject меняется и желает уведомить
объекты Observer об этом изменении.
+attach( o : Observer )
+detach( o : Observer )
+notify()
Subject
subjects
0..*
observers
0..*
+attach( s : Subject )
+detach( s : Subject )
+update( s : Subject )
Observer
Рис. 25.24. Пример применения шаблона Observer