Метафора
Часто встречающийся шаблон из реальной жизни, представьте, что вы подписались на e-mail рассылку на каком-либо сайте, при этом, когда выходит новая статья, инициируется событие уведомления Вас о её выходе.
Назначение
Позволяет определить зависимость «один-ко-многим» так, что при изменении одного объекта, все зависимые от этого изменения объекты были оповещены об этом. В ABAP паттерн реализуется через подписку на события объекта, примером могут служить события ALV при определенных действиях пользователя. Классический же способ не подразумевает использование событий, вместо этого используется агрегация зависимых объектов в инициаторе и вызов некоторого метода у них во время срабатывания события.
Диаграмма
Subject – регистрирует подписчиков и работает с абстракцией Observer. Каждый зарегистрированный подписчик (ConcreteObserever) уведомляется о событии на инициаторе.
Пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
*&---------------------------------------------------------------------* *& Определение и описание классов *&---------------------------------------------------------------------* CLASS lcl_observer DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: update ABSTRACT IMPORTING iv_data TYPE string. ENDCLASS. CLASS lcl_concrete_observer DEFINITION INHERITING FROM lcl_observer. PUBLIC SECTION. METHODS: update REDEFINITION. ENDCLASS. CLASS lcl_concrete_observer IMPLEMENTATION. METHOD update. WRITE: / 'Update: ', iv_data. ENDMETHOD. ENDCLASS. CLASS lcl_subject DEFINITION. PUBLIC SECTION. METHODS: attach_observer IMPORTING io_observer TYPE REF TO lcl_observer, raise_event. PRIVATE SECTION. DATA: mt_observers TYPE STANDARD TABLE OF REF TO lcl_observer. ENDCLASS. CLASS lcl_subject IMPLEMENTATION. METHOD attach_observer. APPEND io_observer TO mt_observers. ENDMETHOD. METHOD raise_event. DATA: lo_observer TYPE REF TO lcl_observer. LOOP AT mt_observers INTO lo_observer. lo_observer->update( |{ sy-tabix }| ). ENDLOOP. ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Работка с объектами шаблона *&---------------------------------------------------------------------* START-OF-SELECTION. DATA: lo_subject TYPE REF TO lcl_subject, lo_observer TYPE REF TO lcl_concrete_observer. CREATE OBJECT lo_subject. CREATE OBJECT lo_observer. lo_subject->attach_observer( lo_observer ). CREATE OBJECT lo_observer. lo_subject->attach_observer( lo_observer ). lo_subject->raise_event( ). |
Шаблон может быть использован, если требуется дополнительная обработка при подписке/отписке на события, т.к. реализация, построенная на событиях, не может контролировать этот процесс (например, разрешить подписку на событие только после проверки на полномочия).