ABAP design pattern example-adapter pattern

background

There are two ways to implement the adapter mode, class adapter and object adapter. Because ABAP does not support multiple inheritance, the class adapter can actually only adapt to one Adaptee (adapter)

Basic realization

Class adapter

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( ).

Object adapter

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( ).

Application examples

Use two different methods to display data (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( ).

Guess you like

Origin blog.csdn.net/u012232542/article/details/106621668