背景
适配器模式有两种实现方式,类适配器和对象适配器,因ABAP不支持多继承,故类适配器实际了只能适配一个Adaptee(适配者)
基础实现
类适配器
class adaptee definition create public.
public section.
methods: adaptee_request.
endclass.
class adaptee implementation.
method adaptee_request.
write:/ 'request from adaptee'.
endmethod.
endclass.
interface if_target.
methods: request.
endinterface.
class class_adapter definition inheriting from adaptee create public.
public section.
interfaces:if_target.
endclass.
class class_adapter implementation.
method if_target~request.
me->adaptee_request( ).
endmethod.
endclass.
start-of-selection.
data(lo_class_adapter) = new class_adapter( ).
lo_class_adapter->if_target~request( ).
对象适配器
class adaptee definition create public.
public section.
methods: adaptee_request.
endclass.
class adaptee implementation.
method adaptee_request.
write:/ 'request from adaptee'.
endmethod.
endclass.
interface if_target.
methods: request.
endinterface.
class object_adapter definition create public.
public section.
interfaces:if_target.
methods:constructor
importing io_adaptee type ref to adaptee.
private section.
data:mo_adaptee type ref to adaptee.
endclass.
class object_adapter implementation.
method constructor.
me->mo_adaptee = io_adaptee.
endmethod.
method if_target~request.
mo_adaptee->adaptee_request( ).
endmethod.
endclass.
start-of-selection.
data(lo_adaptee) = new adaptee( ).
data(lo_object_adapter) = new object_adapter( lo_adaptee ).
lo_object_adapter->if_target~request( ).
应用举例
使用两种不同的方法展示数据(demo && SALV)
"简单demo显示
class demo_output definition create public.
public section.
methods: display_demo importing it_data type index table.
endclass.
class demo_output implementation.
method display_demo.
cl_demo_output=>display_data( it_data ).
endmethod.
endclass.
"SALV显示
class salv_output definition create public.
public section.
methods:display_salv importing it_data type index table.
endclass.
class salv_output implementation.
method display_salv.
data:lr_data type ref to data.
field-symbols:<fs_data> type index table.
create data lr_data like it_data.
assign lr_data->* to <fs_data>.
<fs_data> = corresponding #( it_data ).
cl_salv_table=>factory(
exporting
list_display = if_salv_c_bool_sap=>true
importing
r_salv_table = data(lo_salv)
changing
t_table = <fs_data>
).
lo_salv->display( ).
endmethod.
endclass.
"适配器接口
class abstract_output definition abstract create public.
public section.
methods:display_data importing it_data type index table.
endclass.
class abstract_output implementation.
method display_data.
message '显示功能未实现' type 'E'.
endmethod.
endclass.
"DEMO适配器
class demo_adapter definition inheriting from abstract_output create public final.
public section.
methods: display_data redefinition.
private section.
data:mo_output type ref to demo_output.
endclass.
class demo_adapter implementation.
method display_data.
mo_output = new demo_output( ).
mo_output->display_demo( it_data ).
endmethod.
endclass.
"SALV适配器
class salv_adapter definition inheriting from abstract_output create public final.
public section.
methods: display_data redefinition.
private section.
data:mo_output type ref to salv_output.
endclass.
class salv_adapter implementation.
method display_data.
mo_output = new salv_output( ).
mo_output->display_salv( it_data = it_data ).
endmethod.
endclass.
"程序执行入口
class lcl_main definition create public.
public section.
class-methods:class_constructor,
excute.
private section.
class-data:mt_data type table of zlookup,
mo_adapter type ref to abstract_output.
endclass.
class lcl_main implementation.
method class_constructor.
select *
into table @mt_data
up to 10 rows
from zlookup.
endmethod.
method excute.
"demo display
mo_adapter = new demo_adapter( ).
mo_adapter->display_data( mt_data ).
"alv display
mo_adapter = new salv_adapter( ).
mo_adapter->display_data( mt_data ).
endmethod.
endclass.
start-of-selection.
lcl_main=>excute( ).