Метафора
Представьте себе китайскую вилку и нашу розетку, воткнуть просто так без адаптера у вас не выйдет.
Назначение
Есть некоторые разрозненные классы, которые поддерживают требуемые данные и поведения, однако они не предоставляют необходимого интерфейса для взаимодействия с ними. Для этого Вам необходимо создать класс обёртку с нужным интерфейсом, который внутри себя будет инкапсулировать те самые разрозненные классы, и переадресовывать вызовы из нужного Вам интерфейса к ним.
Диаграмма
Client использует абстракцию Target с нужным ему интерфейсом, класс Adapter реализует этот интерфейс, а уже внутри себя производит перенаправление запроса к целевому объекту Adaptee. Данная диаграмма представляет адаптер уровня объектов, кроме этого может быть еще и адаптер уровня классов. В классическом виде такой адаптер реализуется через множественное наследование, но т.к. ABAP это не поддерживает, представим его через интерфейс:
Adapter в данном случае реализует интерфейс подходящий для клиента и благодаря наследованию поведение Adaptee, внутри себя делает перенаправление из одного метода в другой.
Пример
Адаптер уровня объектов:
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 |
*&---------------------------------------------------------------------* *& Определение классов шаблона *&---------------------------------------------------------------------* CLASS lcl_target DEFINITION ABSTRACT. PUBLIC SECTION. METHODS: request ABSTRACT. ENDCLASS. CLASS lcl_adaptee DEFINITION. PUBLIC SECTION. METHODS: specialRequest. ENDCLASS. CLASS lcl_adaptee IMPLEMENTATION. METHOD specialRequest. WRITE: / 'Adaptee Call'. ENDMETHOD. ENDCLASS. CLASS lcl_adapter DEFINITION INHERITING FROM lcl_target. PUBLIC SECTION. METHODS: request REDEFINITION, constructor. PRIVATE SECTION. DATA: mo_adaptee TYPE REF TO lcl_adaptee. ENDCLASS. CLASS lcl_adapter IMPLEMENTATION. METHOD constructor. super->constructor( ). CREATE OBJECT mo_adaptee. ENDMETHOD. METHOD request. mo_adaptee->specialrequest( ). ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Работа с шаблоном *&---------------------------------------------------------------------* START-OF-SELECTION. DATA: lo_adapter TYPE REF TO lcl_adapter. CREATE OBJECT lo_adapter. lo_adapter->request( ). |
Адаптер уровня классов:
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 |
*&---------------------------------------------------------------------* *& Определение классов шаблона *&---------------------------------------------------------------------* INTERFACE lif_target. METHODS: request. ENDINTERFACE. CLASS lcl_adaptee DEFINITION. PUBLIC SECTION. METHODS: specialRequest. ENDCLASS. CLASS lcl_adaptee IMPLEMENTATION. METHOD specialRequest. WRITE:/ 'Adaptee Call'. ENDMETHOD. ENDCLASS. CLASS lcl_adapter DEFINITION INHERITING FROM lcl_adaptee. PUBLIC SECTION. INTERFACES: lif_target. ALIASES request FOR lif_target~request. ENDCLASS. CLASS lcl_adapter IMPLEMENTATION. METHOD request. me->specialrequest( ). ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Работа с шаблоном *&---------------------------------------------------------------------* START-OF-SELECTION. DATA: lo_adapter TYPE REF TO lcl_adapter. CREATE OBJECT lo_adapter. lo_adapter->request( ). |