├── zdp_memento.abap ├── zdp_composite2.abap ├── zdp_abstractfactory2.abap ├── zdp_singletonfactory.abap ├── README.md ├── .project ├── zdp_visitor.abap ├── zdp_adapter.abap ├── zdp_singleton.abap ├── zdp_facade.abap ├── zdp_prototype.abap ├── zdp_observer.abap ├── zdp_proxy.abap ├── zdp_strategy.abap ├── zdp_templatemethod.abap ├── zdp_state.abap ├── zdp_command.abap ├── zdp_bridge.abap ├── zdp_interpreter.abap ├── zdp_factorymethod.abap ├── zdp_builder.abap ├── zdp_flyweight.abap ├── zdp_abstractfactory.abap ├── zdp_factorymethod2.abap ├── zdp_mediator.abap ├── zdp_decorator.abap ├── zdp_composite.abap ├── zdp_chainofresp.abap ├── zdp_state2.abap ├── zdp_factorymethod3.abap └── zdp_iterator.abap /zdp_memento.abap: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /zdp_composite2.abap: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /zdp_abstractfactory2.abap: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /zdp_singletonfactory.abap: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 23 Design Patterns in ABAP 2 | ================= 3 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | ABAPDesignPattern 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /zdp_visitor.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_VISITOR 3 | *& Tight Coupled Visitor 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_visitor. 9 | 10 | INTERFACE lif_visitable. 11 | METHODS: accept IMPORTING visitor. 12 | ENDINTERFACE. 13 | 14 | INTERFACE lif_visitor. 15 | METHODS: visit IMPORTING visitable. 16 | ENDINTERFACE. 17 | 18 | CLASS simple_visitable DEFINITION. 19 | PUBLIC SECTION. 20 | INTERFACES: lif_visitable. 21 | ENDCLASS. 22 | 23 | CLASS simple_visitable IMPLEMENTATION. 24 | METHOD lif_visitable~accept. 25 | visitor.visit(me). 26 | ENDMETHOD. 27 | ENDCLASS. 28 | 29 | CLASS simple_visitor DEFINITION. 30 | PUBLIC SECTION. 31 | INTERFACES: lif_visitor. 32 | ENDCLASS. 33 | 34 | CLASS simple_visitor IMPLEMENTATION. 35 | METHOD lif_visitor~visit. 36 | visitable.accept( ). 37 | ENDMETHOD. 38 | ENDCLASS. 39 | 40 | 41 | START-OF-SELECTION. 42 | 43 | -------------------------------------------------------------------------------- /zdp_adapter.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_ADAPTER 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_adapter. 9 | 10 | INTERFACE lif_output. 11 | METHODS: generate_output. 12 | ENDINTERFACE. 13 | 14 | CLASS simple_op DEFINITION. 15 | PUBLIC SECTION. 16 | INTERFACES: lif_output. 17 | ENDCLASS. 18 | 19 | CLASS simple_op IMPLEMENTATION. 20 | METHOD lif_output~generate_output. 21 | WRITE: / 'Simple Output - just using write.'. 22 | ENDMETHOD. 23 | ENDCLASS. 24 | 25 | CLASS tree_output DEFINITION. 26 | PUBLIC SECTION. 27 | METHODS: generate_tree. 28 | ENDCLASS. 29 | 30 | CLASS tree_output IMPLEMENTATION. 31 | METHOD generate_tree. 32 | WRITE: / 'Creating Tree ... using CL_GUI_ALV_TREE'. 33 | ENDMETHOD. 34 | ENDCLASS. 35 | 36 | CLASS new_complex_op DEFINITION. 37 | PUBLIC SECTION. 38 | INTERFACES: lif_output. 39 | ENDCLASS. 40 | 41 | CLASS new_complex_op IMPLEMENTATION. 42 | METHOD lif_output~generate_output. 43 | DATA: o_tree_op TYPE REF TO tree_output. 44 | CREATE OBJECT o_tree_op. 45 | o_tree_op->generate_tree( ). 46 | ENDMETHOD. 47 | ENDCLASS. 48 | 49 | START-OF-SELECTION. 50 | DATA: o_op TYPE REF TO lif_output. 51 | CREATE OBJECT o_op TYPE simple_op. 52 | o_op->generate_output( ). 53 | 54 | CREATE OBJECT o_op TYPE new_complex_op. 55 | o_op->generate_output( ). -------------------------------------------------------------------------------- /zdp_singleton.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_SINGLETON 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_singleton. 9 | 10 | 11 | CLASS lcl_application DEFINITION CREATE PRIVATE. 12 | PUBLIC SECTION. 13 | CLASS-METHODS: 14 | get_instance 15 | RETURNING VALUE(ro_instance) TYPE REF TO lcl_application. 16 | 17 | METHODS: 18 | set_name IMPORTING iv_name TYPE char30, 19 | get_name RETURNING VALUE(rv_name) TYPE char30. 20 | 21 | PRIVATE SECTION. 22 | CLASS-DATA: lo_apps TYPE REF TO lcl_application. 23 | DATA: v_name TYPE char30. 24 | ENDCLASS. 25 | 26 | CLASS lcl_application IMPLEMENTATION. 27 | METHOD get_instance. 28 | IF lo_apps IS INITIAL. 29 | CREATE OBJECT lo_apps. 30 | ENDIF. 31 | 32 | ro_instance = lo_apps. 33 | ENDMETHOD. 34 | 35 | METHOD set_name. 36 | me->v_name = iv_name. 37 | ENDMETHOD. 38 | 39 | METHOD get_name. 40 | rv_name = me->v_name. 41 | ENDMETHOD. 42 | ENDCLASS. 43 | 44 | START-OF-SELECTION. 45 | DATA: lo_application TYPE REF TO lcl_application. 46 | DATA: lv_result TYPE char30. 47 | 48 | WRITE: / 'LO_APPLICATION'. 49 | 50 | lo_application = lcl_application=>get_instance( ). 51 | lo_application->set_name( ' This is first object' ). 52 | 53 | lv_result = lo_application->get_name( ). 54 | WRITE: / lv_result. 55 | CLEAR lv_result. 56 | 57 | DATA: lo_2nd_apps TYPE REF TO lcl_application. 58 | SKIP 2. 59 | WRITE: / 'LO_2ND_APPS : '. 60 | lo_2nd_apps = lcl_application=>get_instance( ). 61 | lv_result = lo_2nd_apps->get_name( ). 62 | WRITE: / lv_result. 63 | CLEAR lv_result. -------------------------------------------------------------------------------- /zdp_facade.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_FACADE 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_facade. 9 | 10 | CLASS lcl_data DEFINITION. 11 | PUBLIC SECTION. 12 | METHODS: constructor. 13 | ENDCLASS. 14 | 15 | INTERFACE lif_write. 16 | METHODS: write_data. 17 | ENDINTERFACE. 18 | 19 | CLASS lcl_write_alv DEFINITION. 20 | PUBLIC SECTION. 21 | INTERFACES: lif_write. 22 | ENDCLASS. 23 | 24 | CLASS lcl_write_log DEFINITION. 25 | PUBLIC SECTION. 26 | INTERFACES: lif_write. 27 | ENDCLASS. 28 | 29 | CLASS lcl_facade DEFINITION. 30 | PUBLIC SECTION. 31 | METHODS: process_report IMPORTING iv_write_type TYPE char1. 32 | ENDCLASS. 33 | 34 | CLASS lcl_data IMPLEMENTATION. 35 | METHOD constructor. 36 | WRITE: / 'Getting Data'. 37 | ENDMETHOD. 38 | ENDCLASS. 39 | 40 | CLASS lcl_write_alv IMPLEMENTATION. 41 | METHOD lif_write~write_data. 42 | WRITE: / 'Writing data in ALV'. 43 | ENDMETHOD. 44 | ENDCLASS. 45 | 46 | CLASS lcl_write_log IMPLEMENTATION. 47 | METHOD lif_write~write_data. 48 | WRITE: / 'Wring data in Log'. 49 | ENDMETHOD. 50 | ENDCLASS. 51 | 52 | CLASS lcl_facade IMPLEMENTATION. 53 | METHOD process_report. 54 | DATA: lo_data TYPE REF TO lcl_data. 55 | CREATE OBJECT lo_data. 56 | 57 | DATA: lo_write TYPE REF TO lif_write. 58 | IF iv_write_type = 'A'. 59 | CREATE OBJECT lo_write TYPE lcl_write_alv. 60 | ELSE. 61 | CREATE OBJECT lo_write TYPE lcl_write_log. 62 | ENDIF. 63 | lo_write->write_data( ). 64 | ENDMETHOD. 65 | ENDCLASS. 66 | 67 | START-OF-SELECTION. 68 | DATA: lo_facade TYPE REF TO lcl_facade. 69 | CREATE OBJECT lo_facade. 70 | lo_facade->process_report( iv_write_type = 'A' ). -------------------------------------------------------------------------------- /zdp_prototype.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_PROTOTYPE 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_prototype. 9 | 10 | 11 | CLASS prototype DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: 14 | constructor IMPORTING iv_id TYPE string 15 | ,get_id RETURNING VALUE(rv_id) TYPE string 16 | ,clone ABSTRACT RETURNING VALUE(ro_prototype) TYPE REF TO prototype. 17 | 18 | PRIVATE SECTION. 19 | DATA: id TYPE string. 20 | ENDCLASS. 21 | 22 | CLASS prototype IMPLEMENTATION. 23 | METHOD constructor. 24 | me->id = iv_id. 25 | ENDMETHOD. 26 | 27 | METHOD get_id. 28 | rv_id = me->id. 29 | ENDMETHOD. 30 | ENDCLASS. 31 | 32 | CLASS concrete_prototype1 DEFINITION INHERITING FROM prototype. 33 | PUBLIC SECTION. 34 | METHODS: 35 | clone REDEFINITION. 36 | ENDCLASS. 37 | 38 | CLASS concrete_prototype1 IMPLEMENTATION. 39 | METHOD clone. 40 | ro_prototype = me. 41 | ENDMETHOD. 42 | ENDCLASS. 43 | 44 | CLASS concrete_prototype2 DEFINITION INHERITING FROM prototype. 45 | PUBLIC SECTION. 46 | METHODS: 47 | clone REDEFINITION. 48 | ENDCLASS. 49 | 50 | CLASS concrete_prototype2 IMPLEMENTATION. 51 | METHOD clone. 52 | ro_prototype = me. 53 | ENDMETHOD. 54 | ENDCLASS. 55 | 56 | CLASS mainapp DEFINITION. 57 | PUBLIC SECTION. 58 | CLASS-METHODS: 59 | main. 60 | ENDCLASS. 61 | 62 | CLASS mainapp IMPLEMENTATION. 63 | METHOD main. 64 | DATA: p1 TYPE REF TO concrete_prototype1 65 | ,c1 TYPE REF TO concrete_prototype1 66 | , p2 TYPE REF TO concrete_prototype2 67 | , c2 TYPE REF TO concrete_prototype2 68 | , id TYPE string. 69 | 70 | FIELD-SYMBOLS TYPE REF TO prototype. 71 | 72 | CREATE OBJECT p1 EXPORTING iv_id = 'I'. 73 | 74 | c1 ?= p1->clone( ). 75 | 76 | id = c1->get_id( ). 77 | WRITE: / 'Cloned: {0}', id. 78 | 79 | CREATE OBJECT p2 EXPORTING iv_id = 'II'. 80 | c2 ?= p2->clone( ). 81 | id = c2->get_id( ). 82 | WRITE: / 'Cloned: {0}', id. 83 | ENDMETHOD. 84 | 85 | ENDCLASS. 86 | 87 | START-OF-SELECTION. 88 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_observer.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_OBSERVER 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | PROGRAM zdp_observer. 9 | 10 | 11 | CLASS main_process DEFINITION. 12 | PUBLIC SECTION. 13 | METHODS: set_state IMPORTING iv_state TYPE char1. 14 | EVENTS: state_changed EXPORTING VALUE(new_state) TYPE char1. 15 | PRIVATE SECTION. 16 | DATA: current_state TYPE char1. 17 | ENDCLASS. 18 | 19 | CLASS main_process IMPLEMENTATION. 20 | METHOD set_state. 21 | current_state = iv_state. 22 | SKIP 2. 23 | WRITE: / 'Main Process new state', current_state. 24 | RAISE EVENT state_changed EXPORTING new_state = current_state. 25 | ENDMETHOD. 26 | ENDCLASS. 27 | 28 | CLASS myfunction DEFINITION ABSTRACT. 29 | PUBLIC SECTION. 30 | METHODS: on_state_changed ABSTRACT 31 | FOR EVENT state_changed OF main_process 32 | IMPORTING new_state. 33 | ENDCLASS. 34 | 35 | CLASS myalv DEFINITION INHERITING FROM myfunction. 36 | PUBLIC SECTION. 37 | METHODS: on_state_changed REDEFINITION. 38 | ENDCLASS. 39 | 40 | 41 | CLASS myalv IMPLEMENTATION. 42 | METHOD on_state_changed. 43 | WRITE: / 'New state in ALV processing', new_state. 44 | ENDMETHOD. 45 | ENDCLASS. 46 | 47 | CLASS mydb DEFINITION INHERITING FROM myfunction. 48 | PUBLIC SECTION. 49 | METHODS: on_state_changed REDEFINITION. 50 | ENDCLASS. 51 | 52 | CLASS mydb IMPLEMENTATION. 53 | METHOD on_state_changed. 54 | WRITE: / 'New State in DB processing', new_state. 55 | ENDMETHOD. 56 | ENDCLASS. 57 | 58 | CLASS main_app DEFINITION. 59 | PUBLIC SECTION. 60 | CLASS-METHODS: run. 61 | ENDCLASS. 62 | 63 | CLASS main_app IMPLEMENTATION. 64 | METHOD run. 65 | DATA: lo_process TYPE REF TO main_process. 66 | DATA: lo_alv TYPE REF TO myalv. 67 | DATA: lo_db TYPE REF TO mydb. 68 | 69 | CREATE OBJECT lo_process. 70 | CREATE OBJECT: lo_alv, lo_db. 71 | 72 | SET HANDLER lo_alv->on_state_changed FOR lo_process. 73 | SET HANDLER lo_db->on_state_changed FOR lo_process. 74 | 75 | lo_process->set_state( 'A' ). 76 | lo_process->set_state( 'B' ). 77 | lo_process->set_state( 'C' ). 78 | ENDMETHOD. 79 | ENDCLASS. 80 | 81 | START-OF-SELECTION. 82 | main_app=>run( ). -------------------------------------------------------------------------------- /zdp_proxy.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_PROXY 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_proxy. 9 | 10 | 11 | INTERFACE lif_data. 12 | DATA: t_t100 TYPE tt_t100. 13 | METHODS: get_data IMPORTING iv_spras TYPE spras OPTIONAL 14 | CHANGING ct_data TYPE tt_t100. 15 | METHODS: write_data. 16 | ENDINTERFACE. 17 | 18 | CLASS lcl_proxy_data DEFINITION. 19 | PUBLIC SECTION. 20 | INTERFACES: lif_data. 21 | PRIVATE SECTION. 22 | DATA: o_t100_data TYPE REF TO lif_data. 23 | ENDCLASS. 24 | 25 | CLASS lcl_t100_data DEFINITION. 26 | PUBLIC SECTION. 27 | INTERFACES: lif_data. 28 | ENDCLASS. 29 | 30 | CLASS lcl_proxy_data IMPLEMENTATION. 31 | METHOD lif_data~get_data. 32 | IF iv_spras NE sy-langu. 33 | EXIT. 34 | ENDIF. 35 | 36 | CREATE OBJECT o_t100_data TYPE lcl_t100_data. 37 | o_t100_data->get_data( 38 | EXPORTING 39 | iv_spras = iv_spras 40 | CHANGING 41 | ct_data = ct_data 42 | ). 43 | ENDMETHOD. 44 | 45 | METHOD lif_data~write_data. 46 | IF o_t100_data IS NOT BOUND. 47 | WRITE: / 'No data to display'. 48 | ELSE. 49 | o_t100_data->write_data( ). 50 | ENDIF. 51 | ENDMETHOD. 52 | ENDCLASS. 53 | 54 | CLASS lcl_t100_data IMPLEMENTATION. 55 | METHOD lif_data~get_data. 56 | SELECT * FROM t100 INTO TABLE lif_data~t_t100 57 | UP TO 200000000 ROWS WHERE sprsl = iv_spras. 58 | ct_data = lif_data~t_t100. 59 | ENDMETHOD. 60 | 61 | METHOD lif_data~write_data. 62 | DATA: lv_lines TYPE i. 63 | lv_lines = lines( lif_data~t_t100 ). 64 | WRITE: / 'Total lines', lv_lines. 65 | ENDMETHOD. 66 | ENDCLASS. 67 | 68 | CLASS lcl_main_app DEFINITION. 69 | PUBLIC SECTION. 70 | CLASS-METHODS:run. 71 | ENDCLASS. 72 | 73 | CLASS lcl_main_app IMPLEMENTATION. 74 | METHOD run. 75 | DATA: lo_proxy TYPE REF TO lif_data. 76 | DATA: lt_data TYPE tt_t100. 77 | 78 | CREATE OBJECT lo_proxy TYPE lcl_proxy_data. 79 | lo_proxy->get_data( 80 | EXPORTING 81 | iv_spras = 'E' 82 | CHANGING 83 | ct_data = lt_data 84 | ). 85 | 86 | lo_proxy->write_data( ). 87 | ENDMETHOD. 88 | ENDCLASS. 89 | 90 | START-OF-SELECTION. 91 | lcl_main_app=>run( ). -------------------------------------------------------------------------------- /zdp_strategy.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_STRATEGY 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_strategy. 9 | 10 | 11 | INTERFACE strategy. 12 | METHODS: algorithm. 13 | ENDINTERFACE. 14 | 15 | CLASS concrete_strategya DEFINITION. 16 | PUBLIC SECTION. 17 | INTERFACES: strategy. 18 | ENDCLASS. 19 | 20 | CLASS concrete_strategya IMPLEMENTATION. 21 | METHOD strategy~algorithm. 22 | WRITE: / 'Called Concreate Strategy A Algorithm Interface.'. 23 | ENDMETHOD. 24 | ENDCLASS. 25 | 26 | CLASS concrete_strategyb DEFINITION. 27 | PUBLIC SECTION. 28 | INTERFACES: strategy. 29 | ENDCLASS. 30 | 31 | CLASS concrete_strategyb IMPLEMENTATION. 32 | METHOD strategy~algorithm. 33 | WRITE: / 'Called Concreate Strategy B Algorithm Interface.'. 34 | ENDMETHOD. 35 | ENDCLASS. 36 | 37 | CLASS concrete_strategyc DEFINITION. 38 | PUBLIC SECTION. 39 | INTERFACES: strategy. 40 | ENDCLASS. 41 | 42 | CLASS concrete_strategyc IMPLEMENTATION. 43 | METHOD strategy~algorithm. 44 | WRITE: / 'Called Concreate Strategy C Algorithm Interface.'. 45 | ENDMETHOD. 46 | ENDCLASS. 47 | 48 | CLASS context DEFINITION. 49 | PUBLIC SECTION. 50 | METHODS: constructor IMPORTING io_instance TYPE REF TO strategy 51 | , context_interface. 52 | PRIVATE SECTION. 53 | DATA: mstrategy TYPE REF TO strategy. 54 | ENDCLASS. 55 | 56 | CLASS context IMPLEMENTATION. 57 | METHOD constructor. 58 | mstrategy = io_instance. 59 | ENDMETHOD. 60 | 61 | METHOD context_interface. 62 | me->mstrategy->algorithm( ). 63 | ENDMETHOD. 64 | ENDCLASS. 65 | 66 | CLASS mainapp DEFINITION. 67 | PUBLIC SECTION. 68 | CLASS-METHODS: main. 69 | ENDCLASS. 70 | 71 | CLASS mainapp IMPLEMENTATION. 72 | METHOD main. 73 | DATA: o_context TYPE REF TO context. 74 | DATA: o_strategy TYPE REF TO strategy. 75 | 76 | CREATE OBJECT o_strategy TYPE concrete_strategya. 77 | CREATE OBJECT o_context EXPORTING io_instance = o_strategy. 78 | o_context->context_interface( ). 79 | 80 | CREATE OBJECT o_strategy TYPE concrete_strategyb. 81 | CREATE OBJECT o_context EXPORTING io_instance = o_strategy. 82 | o_context->context_interface( ). 83 | 84 | CREATE OBJECT o_strategy TYPE concrete_strategyc. 85 | CREATE OBJECT o_context EXPORTING io_instance = o_strategy. 86 | o_context->context_interface( ). 87 | 88 | ENDMETHOD. 89 | ENDCLASS. 90 | 91 | 92 | START-OF-SELECTION. 93 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_templatemethod.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_TEMPLATEMETHOD 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_templatemethod. 9 | 10 | CLASS template_sandwich DEFINITION ABSTRACT. 11 | PUBLIC SECTION. 12 | METHODS: prepare_sandwich FINAL. 13 | 14 | PROTECTED SECTION. 15 | METHODS: add_butter. 16 | METHODS: add_extra ABSTRACT. 17 | METHODS: add_veggetables ABSTRACT. 18 | PRIVATE SECTION. 19 | METHODS: slice_break. 20 | ENDCLASS. 21 | 22 | CLASS template_sandwich IMPLEMENTATION. 23 | METHOD add_butter. 24 | WRITE: / 'Add thin layer of butter'. 25 | ENDMETHOD. 26 | 27 | METHOD slice_break. 28 | WRITE: / 'Slice Break.'. 29 | ENDMETHOD. 30 | 31 | METHOD prepare_sandwich. 32 | slice_break( ). 33 | add_butter( ). 34 | add_extra( ). 35 | add_veggetables( ). 36 | ENDMETHOD. 37 | ENDCLASS. 38 | 39 | CLASS cheese_sandwich DEFINITION INHERITING FROM template_sandwich. 40 | PUBLIC SECTION. 41 | PROTECTED SECTION. 42 | METHODS: add_extra REDEFINITION. 43 | METHODS: add_veggetables REDEFINITION. 44 | METHODS: add_butter REDEFINITION. 45 | PRIVATE SECTION. 46 | ENDCLASS. 47 | 48 | CLASS cheese_sandwich IMPLEMENTATION. 49 | METHOD add_butter. 50 | WRITE: / 'Add thick layer of butter'. 51 | ENDMETHOD. 52 | 53 | METHOD add_extra. 54 | WRITE:/ 'Add slices of camenbert'. 55 | ENDMETHOD. 56 | 57 | METHOD add_veggetables. 58 | WRITE:/ 'Add tomato slices'. 59 | ENDMETHOD. 60 | ENDCLASS. 61 | 62 | CLASS ham_sandwich DEFINITION INHERITING FROM template_sandwich. 63 | PUBLIC SECTION. 64 | PROTECTED SECTION. 65 | METHODS: add_extra REDEFINITION. 66 | METHODS: add_veggetables REDEFINITION. 67 | PRIVATE SECTION. 68 | ENDCLASS. 69 | 70 | CLASS ham_sandwich IMPLEMENTATION. 71 | METHOD add_extra. 72 | WRITE: / 'Add slice of ham'. 73 | ENDMETHOD. 74 | 75 | METHOD add_veggetables. 76 | WRITE: / 'Add salad leaves'. 77 | WRITE: / 'Add onions'. 78 | ENDMETHOD. 79 | ENDCLASS. 80 | 81 | CLASS mainapp DEFINITION. 82 | PUBLIC SECTION. 83 | CLASS-METHODS: 84 | main. 85 | ENDCLASS. 86 | 87 | CLASS mainapp IMPLEMENTATION. 88 | METHOD main. 89 | DATA: sandwich TYPE REF TO template_sandwich. 90 | CREATE OBJECT sandwich TYPE cheese_sandwich. 91 | 92 | sandwich->prepare_sandwich( ). 93 | 94 | CREATE OBJECT sandwich TYPE ham_sandwich. 95 | sandwich->prepare_sandwich( ). 96 | ENDMETHOD. 97 | ENDCLASS. 98 | 99 | START-OF-SELECTION. 100 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_state.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_STATE 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_state. 9 | 10 | CLASS context DEFINITION DEFERRED. 11 | CLASS cl_abap_typedescr DEFINITION LOAD. 12 | 13 | DATA: moff TYPE i 14 | , slen TYPE i 15 | , mlen TYPE i. 16 | 17 | DEFINE get_clazz_name. 18 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 19 | FIND REGEX 'CLASS=' IN &2 MATCH OFFSET moff match LENGTH mlen. 20 | slen = moff + mlen. 21 | SHIFT &2 BY slen PLACES LEFT. 22 | END-OF-DEFINITION. 23 | 24 | CLASS state DEFINITION ABSTRACT. 25 | PUBLIC SECTION. 26 | METHODS: 27 | handle ABSTRACT IMPORTING io_context TYPE REF TO context. 28 | ENDCLASS. 29 | 30 | CLASS context DEFINITION. 31 | PUBLIC SECTION. 32 | METHODS: constructor IMPORTING io_state TYPE REF TO state, 33 | request. 34 | DATA: mo_state TYPE REF TO state. 35 | ENDCLASS. 36 | 37 | CLASS context IMPLEMENTATION. 38 | METHOD constructor. 39 | me->mo_state = io_state. 40 | ENDMETHOD. 41 | 42 | METHOD request. 43 | me->mo_state->handle( io_context = me ). 44 | ENDMETHOD. 45 | ENDCLASS. 46 | 47 | CLASS concrete_statea DEFINITION INHERITING FROM state. 48 | PUBLIC SECTION. 49 | METHODS: 50 | handle REDEFINITION. 51 | ENDCLASS. 52 | 53 | CLASS concrete_stateb DEFINITION INHERITING FROM state. 54 | PUBLIC SECTION. 55 | METHODS: 56 | handle REDEFINITION. 57 | ENDCLASS. 58 | 59 | CLASS concrete_statea IMPLEMENTATION. 60 | METHOD handle. 61 | DATA: stateb TYPE REF TO state. 62 | DATA: class_name TYPE abap_abstypename. 63 | CREATE OBJECT stateb TYPE concrete_stateb. 64 | io_context->mo_state = stateb. 65 | get_clazz_name stateb class_name. 66 | WRITE: / 'State:', class_name. 67 | ENDMETHOD. 68 | ENDCLASS. 69 | 70 | CLASS concrete_stateb IMPLEMENTATION. 71 | METHOD handle. 72 | DATA: statea TYPE REF TO state. 73 | DATA: class_name TYPE abap_abstypename. 74 | CREATE OBJECT statea TYPE concrete_statea. 75 | io_context->mo_state = statea. 76 | get_clazz_name statea class_name. 77 | WRITE: / 'State:', class_name. 78 | ENDMETHOD. 79 | ENDCLASS. 80 | 81 | CLASS mainapp DEFINITION. 82 | PUBLIC SECTION. 83 | CLASS-METHODS: main. 84 | ENDCLASS. 85 | 86 | CLASS mainapp IMPLEMENTATION. 87 | METHOD: main. 88 | DATA: context TYPE REF TO context. 89 | DATA: state TYPE REF TO concrete_statea. 90 | CREATE OBJECT state. 91 | CREATE OBJECT context EXPORTING io_state = state. 92 | 93 | context->request( ). 94 | context->request( ). 95 | context->request( ). 96 | context->request( ). 97 | 98 | ENDMETHOD. 99 | ENDCLASS. 100 | 101 | START-OF-SELECTION. 102 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_command.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_COMMAND 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_command. 9 | 10 | 11 | CLASS receiver DEFINITION. 12 | PUBLIC SECTION. 13 | METHODS: 14 | action. 15 | ENDCLASS. 16 | 17 | CLASS receiver IMPLEMENTATION. 18 | METHOD action. 19 | WRITE: / 'Console.WriteLine(Called Receiver.Action()'. 20 | ENDMETHOD. 21 | ENDCLASS. 22 | 23 | CLASS command DEFINITION ABSTRACT. 24 | PUBLIC SECTION. 25 | METHODS: 26 | constructor IMPORTING io_receiver TYPE REF TO receiver 27 | , execute ABSTRACT. 28 | 29 | PROTECTED SECTION. 30 | DATA: mo_receiver TYPE REF TO receiver. 31 | ENDCLASS. 32 | 33 | 34 | CLASS command IMPLEMENTATION. 35 | METHOD constructor. 36 | me->mo_receiver = io_receiver. 37 | ENDMETHOD. 38 | ENDCLASS. 39 | 40 | CLASS concrete_command DEFINITION INHERITING FROM command. 41 | PUBLIC SECTION. 42 | METHODS: 43 | execute REDEFINITION. 44 | ENDCLASS. 45 | 46 | 47 | CLASS concrete_command IMPLEMENTATION. 48 | METHOD execute. 49 | me->mo_receiver->action( ). 50 | ENDMETHOD. 51 | ENDCLASS. 52 | 53 | CLASS invoker DEFINITION. 54 | PUBLIC SECTION. 55 | METHODS: 56 | set_command IMPORTING io_command TYPE REF TO command 57 | , execute_command. 58 | PRIVATE SECTION. 59 | DATA: mo_command TYPE REF TO command. 60 | ENDCLASS. 61 | 62 | CLASS invoker IMPLEMENTATION. 63 | METHOD set_command. 64 | me->mo_command = io_command. 65 | ENDMETHOD. 66 | 67 | METHOD execute_command. 68 | me->mo_command->execute( ). 69 | ENDMETHOD. 70 | ENDCLASS. 71 | 72 | CLASS lcl_application DEFINITION CREATE PRIVATE. 73 | PUBLIC SECTION. 74 | CLASS-METHODS:run. 75 | METHODS: constructor. 76 | PRIVATE SECTION. 77 | CLASS-DATA: so_application TYPE REF TO lcl_application. 78 | ENDCLASS. 79 | 80 | CLASS lcl_application IMPLEMENTATION. 81 | METHOD run. 82 | DATA: exc_ref TYPE REF TO cx_root 83 | , exc_text TYPE string. 84 | 85 | IF lcl_application=>so_application IS INITIAL. 86 | TRY . 87 | CREATE OBJECT lcl_application=>so_application. 88 | CATCH cx_sy_create_object_error INTO exc_ref. 89 | exc_text = exc_ref->get_text( ). 90 | MESSAGE exc_text TYPE 'I'. 91 | ENDTRY. 92 | ENDIF. 93 | ENDMETHOD. 94 | 95 | METHOD constructor. 96 | DATA: receiver TYPE REF TO receiver, 97 | command TYPE REF TO concrete_command 98 | , invoker TYPE REF TO invoker. 99 | 100 | CREATE OBJECT receiver. 101 | CREATE OBJECT command EXPORTING io_receiver = receiver. 102 | 103 | CREATE OBJECT invoker. 104 | 105 | invoker->set_command( command ). 106 | invoker->execute_command( ). 107 | ENDMETHOD. 108 | ENDCLASS. 109 | 110 | START-OF-SELECTION. 111 | lcl_application=>run( ). -------------------------------------------------------------------------------- /zdp_bridge.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_BRIDGE 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_bridge. 9 | CLASS abstract_car DEFINITION DEFERRED. 10 | CLASS cl_abap_typedescr DEFINITION LOAD. 11 | 12 | DATA: moff TYPE i 13 | , slen TYPE i 14 | , mlen TYPE i. 15 | 16 | DEFINE get_clazz_name. 17 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 18 | FIND REGEX 'CLASS=' IN &2 MATCH OFFSET moff match LENGTH mlen. 19 | slen = moff + mlen. 20 | SHIFT &2 BY slen PLACES LEFT. 21 | END-OF-DEFINITION. 22 | 23 | CLASS abstract_road DEFINITION ABSTRACT. 24 | PUBLIC SECTION. 25 | METHODS: 26 | set_car IMPORTING io_car TYPE REF TO abstract_car, 27 | run ABSTRACT. 28 | PROTECTED SECTION. 29 | DATA: mo_car TYPE REF TO abstract_car. 30 | ENDCLASS. 31 | 32 | CLASS abstract_road IMPLEMENTATION. 33 | METHOD set_car. 34 | me->mo_car = io_car. 35 | DATA: name TYPE string. 36 | get_clazz_name me->mo_car name. 37 | WRITE: / name. 38 | ENDMETHOD. 39 | ENDCLASS. 40 | 41 | CLASS abstract_car DEFINITION ABSTRACT. 42 | PUBLIC SECTION. 43 | METHODS: 44 | run ABSTRACT. 45 | ENDCLASS. 46 | 47 | CLASS speed_way DEFINITION INHERITING FROM abstract_road. 48 | PUBLIC SECTION. 49 | METHODS: 50 | run REDEFINITION. 51 | ENDCLASS. 52 | 53 | CLASS speed_way IMPLEMENTATION. 54 | METHOD run. 55 | WRITE: ' run on the speed way.'. 56 | me->mo_car->run( ). 57 | ENDMETHOD. 58 | ENDCLASS. 59 | 60 | CLASS street DEFINITION INHERITING FROM abstract_road. 61 | PUBLIC SECTION. 62 | METHODS: 63 | run REDEFINITION. 64 | ENDCLASS. 65 | 66 | CLASS street IMPLEMENTATION. 67 | METHOD run. 68 | WRITE: ' run on the streen.'. 69 | me->mo_car->run( ). 70 | ENDMETHOD. 71 | ENDCLASS. 72 | 73 | CLASS car DEFINITION INHERITING FROM abstract_car. 74 | PUBLIC SECTION. 75 | METHODS: 76 | run REDEFINITION. 77 | ENDCLASS. 78 | 79 | CLASS car IMPLEMENTATION. 80 | METHOD run. 81 | WRITE: / 'this is car runing on '. 82 | ENDMETHOD. 83 | ENDCLASS. 84 | 85 | CLASS bus DEFINITION INHERITING FROM abstract_car. 86 | PUBLIC SECTION. 87 | METHODS: 88 | run REDEFINITION. 89 | ENDCLASS. 90 | 91 | CLASS bus IMPLEMENTATION. 92 | METHOD run. 93 | WRITE: / 'this is bus running on '. 94 | ENDMETHOD. 95 | ENDCLASS. 96 | 97 | CLASS mainapp DEFINITION. 98 | PUBLIC SECTION. 99 | CLASS-METHODS: main. 100 | ENDCLASS. 101 | 102 | CLASS mainapp IMPLEMENTATION. 103 | METHOD main. 104 | DATA: road1 TYPE REF TO speed_way 105 | , road2 TYPE REF TO street. 106 | CREATE OBJECT road1. 107 | CREATE OBJECT road2. 108 | 109 | road1->set_car( NEW car( ) ). 110 | road1->run( ). 111 | road2->set_car( NEW bus( ) ). 112 | road2->run( ). 113 | ENDMETHOD. 114 | ENDCLASS. 115 | 116 | START-OF-SELECTION. 117 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_interpreter.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_INTERPRETER 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_interpreter. 9 | CLASS context DEFINITION DEFERRED. 10 | 11 | CLASS abstract_expression DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: 14 | interpret ABSTRACT IMPORTING io_context TYPE REF TO context. 15 | ENDCLASS. 16 | 17 | CLASS context DEFINITION. 18 | PUBLIC SECTION. 19 | METHODS: constructor IMPORTING iv_input TYPE string 20 | , get_input RETURNING VALUE(rv_input) TYPE string 21 | , set_input IMPORTING iv_input TYPE string 22 | , get_output RETURNING VALUE(rv_output) TYPE string 23 | , set_output IMPORTING iv_output TYPE string. 24 | PRIVATE SECTION. 25 | DATA: mv_input TYPE string 26 | , mv_output TYPE i. 27 | ENDCLASS. 28 | 29 | CLASS context IMPLEMENTATION. 30 | METHOD constructor. 31 | me->mv_input = iv_input. 32 | ENDMETHOD. 33 | METHOD get_input. 34 | rv_input = me->mv_input. 35 | ENDMETHOD. 36 | METHOD set_input. 37 | me->mv_input = iv_input. 38 | ENDMETHOD. 39 | METHOD get_output. 40 | rv_output = me->mv_output. 41 | ENDMETHOD. 42 | METHOD set_output. 43 | me->mv_output = iv_output. 44 | ENDMETHOD. 45 | ENDCLASS. 46 | 47 | CLASS plus_expression DEFINITION INHERITING FROM abstract_expression. 48 | PUBLIC SECTION. 49 | METHODS: 50 | interpret REDEFINITION. 51 | ENDCLASS. 52 | 53 | CLASS plus_expression IMPLEMENTATION. 54 | METHOD interpret. 55 | WRITE: / 'PlusExpression++'. 56 | DATA: input TYPE string. 57 | input = io_context->get_input( ). 58 | 59 | ENDMETHOD. 60 | ENDCLASS. 61 | 62 | 63 | CLASS minus_expression DEFINITION INHERITING FROM abstract_expression. 64 | PUBLIC SECTION. 65 | METHODS: 66 | interpret REDEFINITION. 67 | ENDCLASS. 68 | 69 | CLASS minus_expression IMPLEMENTATION. 70 | METHOD interpret. 71 | WRITE: / 'MinusExpression--'. 72 | DATA: input TYPE string. 73 | input = io_context->get_input( ). 74 | ENDMETHOD. 75 | ENDCLASS. 76 | 77 | CLASS mainapp DEFINITION. 78 | PUBLIC SECTION. 79 | CLASS-METHODS: 80 | main. 81 | ENDCLASS. 82 | 83 | CLASS mainapp IMPLEMENTATION. 84 | METHOD main. 85 | DATA: inputexpr TYPE string. 86 | inputexpr = '10'. 87 | 88 | DATA: context TYPE REF TO context. 89 | CREATE OBJECT context EXPORTING iv_input = inputexpr. 90 | 91 | DATA: list TYPE STANDARD TABLE OF REF TO abstract_expression. 92 | 93 | APPEND NEW plus_expression( ) TO list. 94 | APPEND NEW plus_expression( ) TO list. 95 | 96 | APPEND NEW minus_expression( ) TO list. 97 | APPEND NEW minus_expression( ) TO list. 98 | APPEND NEW minus_expression( ) TO list. 99 | 100 | FIELD-SYMBOLS TYPE REF TO abstract_expression. 101 | 102 | LOOP AT list ASSIGNING . 103 | ->interpret( context ). 104 | ENDLOOP. 105 | ENDMETHOD. 106 | ENDCLASS. 107 | 108 | START-OF-SELECTION. 109 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_factorymethod.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_FACTORYMETHOD 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_factorymethod. 9 | 10 | CLASS product DEFINITION DEFERRED. 11 | CLASS concrete_producta DEFINITION DEFERRED. 12 | CLASS concrete_productb DEFINITION DEFERRED. 13 | 14 | CLASS creator DEFINITION DEFERRED. 15 | CLASS concrete_creatora DEFINITION DEFERRED. 16 | CLASS concrete_creatorb DEFINITION DEFERRED. 17 | 18 | CLASS cl_abap_typedescr DEFINITION LOAD. 19 | 20 | DATA: moff TYPE i 21 | , slen TYPE i 22 | , mlen TYPE i. 23 | 24 | DEFINE get_clazz_name. 25 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 26 | find REGEX 'CLASS=' in &2 MATCH OFFSET moff MATCH LENGTH mlen. 27 | slen = moff + mlen. 28 | SHIFT &2 by slen PLACES LEFT. 29 | END-OF-DEFINITION. 30 | 31 | CLASS product DEFINITION ABSTRACT. 32 | ENDCLASS. 33 | 34 | CLASS concrete_producta DEFINITION INHERITING FROM product. 35 | ENDCLASS. 36 | 37 | CLASS concrete_productb DEFINITION INHERITING FROM product. 38 | ENDCLASS. 39 | 40 | CLASS creator DEFINITION ABSTRACT. 41 | PUBLIC SECTION. 42 | METHODS: 43 | factorymethod ABSTRACT RETURNING VALUE(product) TYPE REF TO product. 44 | ENDCLASS. 45 | 46 | CLASS concrete_creatora DEFINITION INHERITING FROM creator. 47 | PUBLIC SECTION. 48 | METHODS: 49 | factorymethod REDEFINITION. 50 | ENDCLASS. 51 | 52 | CLASS concrete_creatora IMPLEMENTATION. 53 | METHOD factorymethod. 54 | CREATE OBJECT product TYPE concrete_producta. 55 | ENDMETHOD. 56 | ENDCLASS. 57 | 58 | CLASS concrete_creatorb DEFINITION INHERITING FROM creator. 59 | PUBLIC SECTION. 60 | METHODS: 61 | factorymethod REDEFINITION. 62 | ENDCLASS. 63 | 64 | CLASS concrete_creatorb IMPLEMENTATION. 65 | METHOD factorymethod. 66 | CREATE OBJECT product TYPE concrete_productb. 67 | ENDMETHOD. 68 | ENDCLASS. 69 | 70 | CLASS main_app DEFINITION. 71 | PUBLIC SECTION. 72 | CLASS-DATA: oa_creator_coll TYPE TABLE OF REF TO creator. 73 | CLASS-METHODS: main. 74 | ENDCLASS. 75 | 76 | CLASS main_app IMPLEMENTATION. 77 | METHOD main. 78 | DATA: creator TYPE REF TO creator 79 | , concretecreatora TYPE REF TO concrete_creatora 80 | , concretecreatorb TYPE REF TO concrete_creatorb 81 | , product TYPE REF TO product 82 | , class_name TYPE abap_abstypename. 83 | 84 | FIELD-SYMBOLS TYPE any. 85 | 86 | CREATE OBJECT concretecreatora. 87 | APPEND concretecreatora TO oa_creator_coll. 88 | 89 | CREATE OBJECT concretecreatorb. 90 | APPEND concretecreatorb TO oa_creator_coll. 91 | 92 | LOOP AT oa_creator_coll ASSIGNING . 93 | get_clazz_name class_name. 94 | CASE class_name. 95 | WHEN 'CONCRETE_CREATORA'. 96 | WRITE: / 'ConcreteCreatorA Creates Product A'. 97 | WHEN 'CONCRETE_CREATORB'. 98 | WRITE: / 'ConcreteCreatorB Creates Product B'. 99 | ENDCASE. 100 | 101 | creator = . 102 | product = creator->factorymethod( ). 103 | 104 | get_clazz_name product class_name. 105 | WRITE: / 'Product = ', class_name. 106 | ENDLOOP. 107 | ENDMETHOD. 108 | ENDCLASS. 109 | 110 | START-OF-SELECTION. 111 | main_app=>main( ). -------------------------------------------------------------------------------- /zdp_builder.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_BUILDER 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_builder. 9 | 10 | 11 | INTERFACE lif_pizza. 12 | DATA: dough TYPE string, 13 | sauce TYPE string, 14 | topping TYPE string. 15 | ENDINTERFACE. 16 | 17 | CLASS lcl_pizza DEFINITION. 18 | PUBLIC SECTION. 19 | INTERFACES: lif_pizza. 20 | ENDCLASS. 21 | 22 | CLASS pizza_builder DEFINITION ABSTRACT. 23 | PUBLIC SECTION. 24 | METHODS: create_new_pizza 25 | RETURNING VALUE(ro_pizza) TYPE REF TO lif_pizza. 26 | METHODS: build_dough ABSTRACT, 27 | build_sauce ABSTRACT, 28 | build_topping ABSTRACT. 29 | 30 | PROTECTED SECTION. 31 | DATA: pizza TYPE REF TO lif_pizza. 32 | ENDCLASS. 33 | 34 | CLASS pizza_builder IMPLEMENTATION. 35 | METHOD create_new_pizza. 36 | CREATE OBJECT pizza TYPE lcl_pizza. 37 | ro_pizza = pizza. 38 | ENDMETHOD. 39 | ENDCLASS. 40 | 41 | CLASS veg_pizza_builder DEFINITION INHERITING FROM pizza_builder. 42 | PUBLIC SECTION. 43 | METHODS: build_dough REDEFINITION, 44 | build_sauce REDEFINITION, 45 | build_topping REDEFINITION. 46 | ENDCLASS. 47 | 48 | CLASS veg_pizza_builder IMPLEMENTATION. 49 | METHOD build_dough. 50 | pizza->dough = 'Thin Crust'. 51 | ENDMETHOD. 52 | 53 | METHOD build_sauce. 54 | pizza->sauce = 'Mild'. 55 | ENDMETHOD. 56 | 57 | METHOD build_topping. 58 | pizza->topping = 'Olives, Pineapples, Jalapenos'. 59 | ENDMETHOD. 60 | ENDCLASS. 61 | 62 | CLASS cheese_pizza_builder DEFINITION INHERITING FROM pizza_builder. 63 | PUBLIC SECTION. 64 | METHODS: build_dough REDEFINITION, 65 | build_sauce REDEFINITION, 66 | build_topping REDEFINITION. 67 | ENDCLASS. 68 | 69 | 70 | CLASS cheese_pizza_builder IMPLEMENTATION. 71 | METHOD build_dough. 72 | pizza->dough = 'Thick Crust'. 73 | ENDMETHOD. 74 | 75 | METHOD build_sauce. 76 | pizza->sauce = 'Mild Hot'. 77 | ENDMETHOD. 78 | 79 | METHOD build_topping. 80 | pizza->topping = 'Cheese, Cheese, Cheese, more Cheese'. 81 | ENDMETHOD. 82 | ENDCLASS. 83 | 84 | CLASS cook DEFINITION. 85 | PUBLIC SECTION. 86 | METHODS: construct_pizza IMPORTING io_builder TYPE REF TO pizza_builder 87 | RETURNING VALUE(ro_pizza) TYPE REF TO lif_pizza. 88 | PRIVATE SECTION. 89 | DATA: pizzabuilder TYPE REF TO pizza_builder. 90 | ENDCLASS. 91 | 92 | CLASS cook IMPLEMENTATION. 93 | METHOD construct_pizza. 94 | pizzabuilder = io_builder. 95 | ro_pizza = pizzabuilder->create_new_pizza( ). 96 | 97 | pizzabuilder->build_dough( ). 98 | pizzabuilder->build_sauce( ). 99 | pizzabuilder->build_topping( ). 100 | ENDMETHOD. 101 | ENDCLASS. 102 | 103 | 104 | START-OF-SELECTION. 105 | DATA: o_cook TYPE REF TO cook, 106 | o_pizza_builder TYPE REF TO pizza_builder, 107 | o_pizza TYPE REF TO lif_pizza. 108 | CREATE OBJECT o_cook. 109 | 110 | CREATE OBJECT o_pizza_builder TYPE veg_pizza_builder. 111 | o_pizza = o_cook->construct_pizza( o_pizza_builder ). 112 | WRITE: / o_pizza->dough, o_pizza->sauce, o_pizza->topping. 113 | 114 | CREATE OBJECT o_pizza_builder TYPE cheese_pizza_builder. 115 | o_pizza = o_cook->construct_pizza( o_pizza_builder ). 116 | WRITE: / o_pizza->dough, o_pizza->sauce, o_pizza->topping. -------------------------------------------------------------------------------- /zdp_flyweight.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_FLYWEIGHT 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_flyweight. 9 | 10 | 11 | CLASS flyweight DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: 14 | operation ABSTRACT IMPORTING iv_extrincicstate TYPE i. 15 | ENDCLASS. 16 | 17 | CLASS concrete_flyweight DEFINITION INHERITING FROM flyweight. 18 | PUBLIC SECTION. 19 | METHODS: 20 | operation REDEFINITION. 21 | ENDCLASS. 22 | 23 | CLASS concrete_flyweight IMPLEMENTATION. 24 | METHOD operation. 25 | WRITE: /5(20) 'ConcreteFlyweight', iv_extrincicstate. 26 | ENDMETHOD. 27 | ENDCLASS. 28 | 29 | CLASS unshared_concrete_flyweight DEFINITION INHERITING FROM flyweight. 30 | PUBLIC SECTION. 31 | METHODS: 32 | operation REDEFINITION. 33 | ENDCLASS. 34 | 35 | CLASS unshared_concrete_flyweight IMPLEMENTATION. 36 | METHOD operation. 37 | WRITE: /5(20) 'Unshared Concrete Flyweight', iv_extrincicstate. 38 | ENDMETHOD. 39 | ENDCLASS. 40 | 41 | CLASS flyweight_factory DEFINITION. 42 | PUBLIC SECTION. 43 | TYPES: BEGIN OF ty_flyweight, 44 | key(1) TYPE c 45 | , value TYPE REF TO concrete_flyweight 46 | , END OF ty_flyweight. 47 | 48 | METHODS: 49 | constructor 50 | , getflyweight IMPORTING iv_key TYPE c 51 | RETURNING VALUE(ro_value) TYPE REF TO flyweight. 52 | 53 | PRIVATE SECTION. 54 | DATA flyweights TYPE HASHED TABLE OF ty_flyweight WITH UNIQUE KEY key. 55 | ENDCLASS. 56 | 57 | CLASS flyweight_factory IMPLEMENTATION. 58 | METHOD constructor. 59 | DATA: cf TYPE REF TO concrete_flyweight 60 | ,buffer TYPE ty_flyweight . 61 | 62 | CREATE OBJECT cf. 63 | buffer-key = 'X'. 64 | buffer-value = cf. 65 | INSERT buffer INTO TABLE flyweights. 66 | 67 | CREATE OBJECT cf. 68 | buffer-key = 'Y'. 69 | buffer-value = cf. 70 | INSERT buffer INTO TABLE flyweights. 71 | 72 | CREATE OBJECT cf. 73 | buffer-key = 'Z'. 74 | buffer-value = cf. 75 | INSERT buffer INTO TABLE flyweights. 76 | ENDMETHOD. 77 | 78 | METHOD getflyweight. 79 | DATA buffer TYPE ty_flyweight. 80 | READ TABLE flyweights WITH TABLE KEY key = iv_key INTO buffer. 81 | ro_value = buffer-value. 82 | ENDMETHOD. 83 | ENDCLASS. 84 | 85 | CLASS mainapp DEFINITION. 86 | PUBLIC SECTION. 87 | CLASS-METHODS: 88 | main. 89 | ENDCLASS. 90 | 91 | CLASS mainapp IMPLEMENTATION. 92 | METHOD main. 93 | DATA: extrincicstate TYPE i 94 | ,f TYPE REF TO flyweight_factory 95 | ,fx TYPE REF TO flyweight 96 | ,fy TYPE REF TO flyweight 97 | ,fz TYPE REF TO flyweight 98 | ,uf TYPE REF TO unshared_concrete_flyweight 99 | . 100 | extrincicstate = 22. 101 | 102 | CREATE OBJECT f. 103 | fx = f->getflyweight( 'X' ). 104 | SUBTRACT 1 FROM extrincicstate. 105 | fx->operation( extrincicstate ). 106 | 107 | SUBTRACT 1 FROM extrincicstate. 108 | fy = f->getflyweight( 'Y' ). 109 | fy->operation( extrincicstate ). 110 | 111 | SUBTRACT 1 FROM extrincicstate. 112 | fz = f->getflyweight( 'Z' ). 113 | fz->operation( extrincicstate ). 114 | 115 | SUBTRACT 1 FROM extrincicstate. 116 | CREATE OBJECT uf. 117 | uf->operation( extrincicstate ). 118 | ENDMETHOD. 119 | ENDCLASS. 120 | 121 | START-OF-SELECTION. 122 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_abstractfactory.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_ABSTRACTFACTORY 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_abstractfactory. 9 | 10 | 11 | CLASS abs_data DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: read_data ABSTRACT. 14 | ENDCLASS. 15 | 16 | CLASS data_from_file DEFINITION INHERITING FROM abs_data. 17 | PUBLIC SECTION. 18 | METHODS: read_data REDEFINITION. 19 | ENDCLASS. 20 | 21 | 22 | CLASS data_from_file IMPLEMENTATION. 23 | METHOD read_data. 24 | WRITE: / 'Reading data from file'. 25 | ENDMETHOD. 26 | ENDCLASS. 27 | 28 | CLASS data_from_db DEFINITION INHERITING FROM abs_data. 29 | PUBLIC SECTION. 30 | METHODS: read_data REDEFINITION. 31 | ENDCLASS. 32 | 33 | CLASS data_from_db IMPLEMENTATION. 34 | METHOD read_data. 35 | WRITE: / 'Reading data from Database Table'. 36 | ENDMETHOD. 37 | ENDCLASS. 38 | 39 | CLASS abs_print DEFINITION ABSTRACT. 40 | PUBLIC SECTION. 41 | METHODS: write_data ABSTRACT. 42 | ENDCLASS. 43 | 44 | CLASS print_alv DEFINITION INHERITING FROM abs_print. 45 | PUBLIC SECTION. 46 | METHODS: write_data REDEFINITION. 47 | ENDCLASS. 48 | 49 | CLASS print_alv IMPLEMENTATION. 50 | METHOD write_data. 51 | WRITE: / 'Writing data into ALV'. 52 | ENDMETHOD. 53 | ENDCLASS. 54 | 55 | CLASS print_simple DEFINITION INHERITING FROM abs_print. 56 | PUBLIC SECTION. 57 | METHODS: write_data REDEFINITION. 58 | ENDCLASS. 59 | 60 | 61 | CLASS print_simple IMPLEMENTATION. 62 | METHOD write_data. 63 | WRITE: / 'Writing data in classic - This is actually classic'. 64 | ENDMETHOD. 65 | ENDCLASS. 66 | 67 | CLASS REPORT DEFINITION ABSTRACT. 68 | PUBLIC SECTION. 69 | METHODS: get_data ABSTRACT, 70 | print_data ABSTRACT. 71 | ENDCLASS. 72 | 73 | 74 | CLASS simple_report DEFINITION INHERITING FROM REPORT. 75 | PUBLIC SECTION. 76 | METHODS: get_data REDEFINITION. 77 | METHODS: print_data REDEFINITION. 78 | ENDCLASS. 79 | 80 | CLASS simple_report IMPLEMENTATION. 81 | METHOD get_data. 82 | DATA: lo_data TYPE REF TO data_from_file. 83 | CREATE OBJECT lo_data. 84 | lo_data->read_data( ). 85 | ENDMETHOD. 86 | 87 | METHOD print_data. 88 | DATA: lo_print TYPE REF TO print_simple. 89 | CREATE OBJECT lo_print. 90 | lo_print->write_data( ). 91 | ENDMETHOD. 92 | ENDCLASS. 93 | 94 | CLASS complex_report DEFINITION INHERITING FROM REPORT. 95 | PUBLIC SECTION. 96 | METHODS: get_data REDEFINITION. 97 | METHODS: print_data REDEFINITION. 98 | ENDCLASS. 99 | 100 | CLASS complex_report IMPLEMENTATION. 101 | METHOD get_data. 102 | DATA: lo_data TYPE REF TO data_from_db. 103 | CREATE OBJECT lo_data. 104 | lo_data->read_data( ). 105 | ENDMETHOD. 106 | 107 | METHOD print_data. 108 | DATA: lo_print TYPE REF TO print_alv. 109 | CREATE OBJECT lo_print. 110 | lo_print->write_data( ). 111 | ENDMETHOD. 112 | ENDCLASS. 113 | 114 | CLASS lcl_main_app DEFINITION. 115 | PUBLIC SECTION. 116 | CLASS-METHODS: RUN. 117 | ENDCLASS. 118 | 119 | CLASS lcl_main_app IMPLEMENTATION. 120 | METHOD RUN. 121 | DATA: lo_report TYPE REF TO REPORT. 122 | CREATE OBJECT lo_report TYPE simple_report. 123 | lo_report->get_data( ). 124 | lo_report->print_data( ). 125 | 126 | CREATE OBJECT lo_report TYPE complex_report. 127 | lo_report->get_data( ). 128 | lo_report->print_data( ). 129 | ENDMETHOD. 130 | ENDCLASS. 131 | 132 | START-OF-SELECTION. 133 | lcl_main_app=>run( ). -------------------------------------------------------------------------------- /zdp_factorymethod2.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_FACTORYMETHOD2 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_factorymethod2 NO STANDARD PAGE HEADING LINE-SIZE 80. 9 | 10 | CLASS cl_abap_typedescr DEFINITION LOAD. 11 | 12 | DATA: moff TYPE i 13 | , slen TYPE i 14 | , mlen TYPE i. 15 | 16 | DEFINE get_clazz_name. 17 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 18 | find REGEX 'CLASS=' in &2 MATCH OFFSET moff MATCH LENGTH mlen. 19 | slen = moff + mlen. 20 | SHIFT &2 by slen PLACES LEFT. 21 | END-OF-DEFINITION. 22 | 23 | INTERFACE product. 24 | TYPES ty_productname(30) TYPE c. 25 | DATA: name TYPE ty_productname. 26 | 27 | METHODS: 28 | get_name RETURNING VALUE(name) TYPE ty_productname. 29 | ENDINTERFACE. 30 | 31 | CLASS concrete_producta DEFINITION. 32 | PUBLIC SECTION. 33 | INTERFACES: 34 | product. 35 | ENDCLASS. 36 | 37 | CLASS concrete_producta IMPLEMENTATION. 38 | METHOD product~get_name. 39 | name = 'ConcreteProductA'. 40 | ENDMETHOD. 41 | ENDCLASS. 42 | 43 | CLASS concrete_productb DEFINITION. 44 | PUBLIC SECTION. 45 | INTERFACES: 46 | product. 47 | ENDCLASS. 48 | 49 | CLASS concrete_productb IMPLEMENTATION. 50 | METHOD product~get_name. 51 | name = 'ConCreteProductB'. 52 | ENDMETHOD. 53 | ENDCLASS. 54 | 55 | INTERFACE creator. 56 | METHODS: 57 | factorymethod RETURNING VALUE(product) TYPE REF TO product. 58 | ENDINTERFACE. 59 | 60 | CLASS concrete_creatora DEFINITION. 61 | PUBLIC SECTION. 62 | INTERFACES: 63 | creator. 64 | ENDCLASS. 65 | 66 | CLASS concrete_creatora IMPLEMENTATION. 67 | METHOD creator~factorymethod. 68 | CREATE OBJECT product TYPE concrete_producta. 69 | ENDMETHOD. 70 | ENDCLASS. 71 | 72 | CLASS concrete_creatorb DEFINITION. 73 | PUBLIC SECTION. 74 | INTERFACES: 75 | creator. 76 | ENDCLASS. 77 | 78 | CLASS concrete_creatorb IMPLEMENTATION. 79 | METHOD creator~factorymethod. 80 | CREATE OBJECT product TYPE concrete_productb. 81 | ENDMETHOD. 82 | ENDCLASS. 83 | 84 | CLASS main_app DEFINITION. 85 | PUBLIC SECTION. 86 | CLASS-DATA: oa_creator_coll TYPE TABLE OF REF TO creator. 87 | CLASS-METHODS: main. 88 | ENDCLASS. 89 | 90 | CLASS main_app IMPLEMENTATION. 91 | METHOD main. 92 | 93 | DATA: concrete_creatora TYPE REF TO concrete_creatora 94 | , concrete_creatorb TYPE REF TO concrete_creatorb 95 | , product TYPE REF TO product 96 | , product_name(30) TYPE c 97 | , class_name TYPE abap_abstypename. 98 | 99 | FIELD-SYMBOLS TYPE REF TO creator. 100 | 101 | CREATE OBJECT concrete_creatora. 102 | APPEND concrete_creatora TO oa_creator_coll. 103 | 104 | CREATE OBJECT concrete_creatorb. 105 | APPEND concrete_creatorb TO oa_creator_coll. 106 | 107 | LOOP AT oa_creator_coll ASSIGNING . 108 | get_clazz_name class_name. 109 | CASE class_name. 110 | WHEN 'CONCRETE_CREATORA'. 111 | WRITE: / 'ConcreteCreatorA Creates Product A'. 112 | WHEN 'CONCRETE_CREATORB'. 113 | WRITE: / 'ConcreteCreatorB Creates Product B'. 114 | ENDCASE. 115 | 116 | product = ->factorymethod( ). 117 | get_clazz_name product class_name. 118 | product_name = product->get_name( ). 119 | WRITE: / 'Class=', class_name, 'Product=', product_name. 120 | ENDLOOP. 121 | ENDMETHOD. 122 | ENDCLASS. 123 | 124 | START-OF-SELECTION. 125 | main_app=>main( ). -------------------------------------------------------------------------------- /zdp_mediator.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_MEDIATOR 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_mediator. 9 | CLASS united_nations DEFINITION DEFERRED. 10 | 11 | CLASS country DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: 14 | constructor IMPORTING io_mediator TYPE REF TO united_nations. 15 | PROTECTED SECTION. 16 | DATA: mo_mediator TYPE REF TO united_nations. 17 | ENDCLASS. 18 | 19 | CLASS country IMPLEMENTATION. 20 | METHOD constructor. 21 | me->mo_mediator = io_mediator. 22 | ENDMETHOD. 23 | ENDCLASS. 24 | 25 | CLASS united_nations DEFINITION ABSTRACT. 26 | PUBLIC SECTION. 27 | METHODS: 28 | declear ABSTRACT IMPORTING iv_message TYPE string 29 | io_colleague TYPE REF TO country. 30 | ENDCLASS. 31 | 32 | CLASS irag DEFINITION INHERITING FROM country. 33 | PUBLIC SECTION. 34 | METHODS: 35 | constructor IMPORTING io_mediator TYPE REF TO united_nations 36 | ,declear IMPORTING iv_message TYPE string 37 | ,get_message IMPORTING iv_message TYPE string 38 | . 39 | ENDCLASS. 40 | 41 | CLASS irag IMPLEMENTATION. 42 | METHOD constructor. 43 | super->constructor( io_mediator ). 44 | ENDMETHOD. 45 | 46 | METHOD declear. 47 | me->mo_mediator->declear( iv_message = iv_message io_colleague = 48 | me ). 49 | ENDMETHOD. 50 | 51 | METHOD get_message. 52 | WRITE: / '伊拉克获得对方信息: ', iv_message. 53 | ENDMETHOD. 54 | ENDCLASS. 55 | 56 | CLASS usa DEFINITION INHERITING FROM country. 57 | PUBLIC SECTION. 58 | METHODS: 59 | constructor IMPORTING io_mediator TYPE REF TO united_nations 60 | ,declear IMPORTING iv_message TYPE string 61 | ,get_message IMPORTING iv_message TYPE string 62 | . 63 | ENDCLASS. 64 | 65 | CLASS usa IMPLEMENTATION. 66 | METHOD constructor. 67 | super->constructor( io_mediator ). 68 | ENDMETHOD. 69 | 70 | METHOD declear. 71 | me->mo_mediator->declear( iv_message = iv_message io_colleague = me ). 72 | ENDMETHOD. 73 | 74 | METHOD get_message. 75 | WRITE: / '美国获得对方信息: ', iv_message. 76 | ENDMETHOD. 77 | ENDCLASS. 78 | 79 | CLASS united_nations_securitycouncil DEFINITION INHERITING FROM united_nations. 80 | 81 | 82 | PUBLIC SECTION. 83 | METHODS: 84 | set_colleague1 IMPORTING io_co1 TYPE REF TO usa, 85 | set_colleague2 IMPORTING io_co2 TYPE REF TO irag, 86 | declear REDEFINITION. 87 | PRIVATE SECTION. 88 | DATA: mo_co1 TYPE REF TO usa, 89 | mo_co2 TYPE REF TO irag. 90 | ENDCLASS. 91 | 92 | 93 | CLASS united_nations_securitycouncil IMPLEMENTATION. 94 | METHOD set_colleague1. 95 | me->mo_co1 = io_co1. 96 | ENDMETHOD. 97 | 98 | METHOD set_colleague2. 99 | me->mo_co2 = io_co2. 100 | ENDMETHOD. 101 | 102 | METHOD declear. 103 | IF io_colleague EQ mo_co1. 104 | mo_co2->get_message( iv_message ). 105 | ELSE. 106 | mo_co1->get_message( iv_message ). 107 | ENDIF. 108 | ENDMETHOD. 109 | ENDCLASS. 110 | 111 | CLASS mainapp DEFINITION. 112 | PUBLIC SECTION. 113 | CLASS-METHODS: 114 | main. 115 | ENDCLASS. 116 | 117 | CLASS mainapp IMPLEMENTATION. 118 | METHOD main. 119 | DATA: unsc TYPE REF TO united_nations_securitycouncil, 120 | c1 TYPE REF TO usa 121 | , c2 TYPE REF TO irag. 122 | CREATE OBJECT unsc. 123 | 124 | c1 = NEW usa( unsc ). 125 | c2 = NEW irag( unsc ). 126 | 127 | unsc->set_colleague2( c2 ). 128 | unsc->set_colleague1( c1 ). 129 | 130 | c1->declear( '不准研制核武器,否则就要发动战争' ). 131 | c2->declear( '我们没有核武器,也不怕侵略' ). 132 | ENDMETHOD. 133 | ENDCLASS. 134 | 135 | START-OF-SELECTION. 136 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_decorator.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_DECORATOR 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_decorator. 9 | 10 | 11 | CLASS output DEFINITION ABSTRACT. 12 | PUBLIC SECTION. 13 | METHODS: process_output ABSTRACT. 14 | ENDCLASS. 15 | 16 | CLASS alv_output DEFINITION INHERITING FROM output. 17 | PUBLIC SECTION. 18 | METHODS: process_output REDEFINITION. 19 | ENDCLASS. 20 | 21 | CLASS alv_output IMPLEMENTATION. 22 | METHOD process_output. 23 | WRITE: / 'Standard ALV output'. 24 | ENDMETHOD. 25 | ENDCLASS. 26 | 27 | CLASS op_decorator DEFINITION INHERITING FROM output. 28 | PUBLIC SECTION. 29 | METHODS: 30 | constructor IMPORTING io_decorator TYPE REF TO output, 31 | process_output REDEFINITION. 32 | PRIVATE SECTION. 33 | DATA: o_decorator TYPE REF TO output. 34 | ENDCLASS. 35 | 36 | 37 | CLASS op_decorator IMPLEMENTATION. 38 | METHOD constructor. 39 | super->constructor( ). 40 | me->o_decorator = io_decorator. 41 | ENDMETHOD. 42 | 43 | METHOD process_output. 44 | CHECK o_decorator IS BOUND. 45 | o_decorator->process_output( ). 46 | ENDMETHOD. 47 | ENDCLASS. 48 | 49 | CLASS op_pdf DEFINITION INHERITING FROM op_decorator. 50 | PUBLIC SECTION. 51 | METHODS: process_output REDEFINITION. 52 | ENDCLASS. 53 | 54 | CLASS op_pdf IMPLEMENTATION. 55 | METHOD process_output. 56 | super->process_output( ). 57 | WRITE: /(10) space, 'Generating PDF'. 58 | ENDMETHOD. 59 | ENDCLASS. 60 | 61 | CLASS op_xls DEFINITION INHERITING FROM op_decorator. 62 | PUBLIC SECTION. 63 | METHODS: process_output REDEFINITION. 64 | ENDCLASS. 65 | 66 | CLASS op_xls IMPLEMENTATION. 67 | METHOD process_output. 68 | super->process_output( ). 69 | WRITE: /(10) space, 'Generating Excel'. 70 | ENDMETHOD. 71 | ENDCLASS. 72 | 73 | CLASS op_email DEFINITION INHERITING FROM op_decorator. 74 | PUBLIC SECTION. 75 | METHODS: process_output REDEFINITION. 76 | ENDCLASS. 77 | 78 | CLASS op_email IMPLEMENTATION. 79 | METHOD process_output. 80 | super->process_output( ). 81 | WRITE: /(10) space, 'Sending Email'. 82 | ENDMETHOD. 83 | ENDCLASS. 84 | 85 | CLASS op_alv DEFINITION INHERITING FROM op_decorator. 86 | PUBLIC SECTION. 87 | METHODS: process_output REDEFINITION. 88 | ENDCLASS. 89 | 90 | 91 | CLASS op_alv IMPLEMENTATION. 92 | METHOD process_output. 93 | super->process_output( ). 94 | WRITE: /(10) space, 'Generating ALV'. 95 | ENDMETHOD. 96 | ENDCLASS. 97 | 98 | 99 | CLASS main_app DEFINITION. 100 | PUBLIC SECTION. 101 | CLASS-METHODS:run IMPORTING 102 | iv_pdf TYPE flag 103 | iv_email TYPE flag 104 | iv_xls TYPE flag. 105 | ENDCLASS. 106 | 107 | CLASS main_app IMPLEMENTATION. 108 | METHOD run. 109 | DATA: lo_decorator TYPE REF TO output, 110 | lo_pre TYPE REF TO output. 111 | 112 | CREATE OBJECT lo_decorator TYPE alv_output. 113 | lo_pre = lo_decorator. 114 | 115 | IF iv_pdf IS NOT INITIAL. 116 | CREATE OBJECT lo_decorator 117 | TYPE op_pdf 118 | EXPORTING 119 | io_decorator = lo_pre. 120 | lo_pre = lo_decorator. 121 | ENDIF. 122 | 123 | IF iv_email IS NOT INITIAL. 124 | CREATE OBJECT lo_decorator 125 | TYPE op_email 126 | EXPORTING 127 | io_decorator = lo_pre. 128 | lo_pre = lo_decorator. 129 | ENDIF. 130 | 131 | IF iv_xls IS NOT INITIAL. 132 | CREATE OBJECT lo_decorator 133 | TYPE op_xls 134 | EXPORTING 135 | io_decorator = lo_pre. 136 | lo_pre = lo_decorator. 137 | ENDIF. 138 | 139 | lo_decorator->process_output( ). 140 | ENDMETHOD. 141 | ENDCLASS. 142 | 143 | PARAMETERS: p_pdf AS CHECKBOX, 144 | p_email AS CHECKBOX, 145 | p_xls AS CHECKBOX. 146 | 147 | START-OF-SELECTION. 148 | main_app=>run( 149 | iv_pdf = p_pdf 150 | iv_email = p_email 151 | iv_xls = p_xls 152 | ). -------------------------------------------------------------------------------- /zdp_composite.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_COMPOSITE 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_composite. 9 | 10 | CLASS lcl_shape DEFINITION ABSTRACT. 11 | PUBLIC SECTION. 12 | METHODS: constructor IMPORTING iv_name TYPE string, 13 | add ABSTRACT IMPORTING io_shape TYPE REF TO lcl_shape, 14 | remove ABSTRACT IMPORTING io_shape TYPE REF TO lcl_shape, 15 | display ABSTRACT IMPORTING indent TYPE i. 16 | PROTECTED SECTION. 17 | DATA: v_name TYPE string. 18 | ENDCLASS. 19 | 20 | CLASS lcl_shape IMPLEMENTATION. 21 | METHOD constructor. 22 | me->v_name = iv_name. 23 | ENDMETHOD. 24 | ENDCLASS. 25 | 26 | CLASS lcl_line DEFINITION INHERITING FROM lcl_shape. 27 | PUBLIC SECTION. 28 | METHODS: constructor IMPORTING iv_name TYPE string. 29 | METHODS: add REDEFINITION, 30 | remove REDEFINITION, 31 | display REDEFINITION. 32 | ENDCLASS. 33 | 34 | CLASS lcl_line IMPLEMENTATION. 35 | METHOD constructor. 36 | super->constructor( iv_name ). 37 | ENDMETHOD. 38 | 39 | METHOD add. 40 | WRITE: / 'Can not add'. 41 | ENDMETHOD. 42 | 43 | METHOD remove. 44 | WRITE: / 'Can not delete'. 45 | ENDMETHOD. 46 | 47 | METHOD display. 48 | WRITE: / ''. 49 | DO indent TIMES. 50 | WRITE: '-'. 51 | ENDDO. 52 | 53 | WRITE: v_name. 54 | ENDMETHOD. 55 | ENDCLASS. 56 | 57 | CLASS lcl_picture DEFINITION INHERITING FROM lcl_shape. 58 | PUBLIC SECTION. 59 | METHODS: constructor IMPORTING iv_name TYPE string. 60 | METHODS: add REDEFINITION, 61 | remove REDEFINITION, 62 | display REDEFINITION. 63 | 64 | PRIVATE SECTION. 65 | TYPES: BEGIN OF lty_shapes, 66 | o_shape TYPE REF TO lcl_shape, 67 | END OF lty_shapes. 68 | DATA: li_shapes TYPE STANDARD TABLE OF REF TO lcl_shape. 69 | ENDCLASS. 70 | 71 | CLASS lcl_picture IMPLEMENTATION. 72 | METHOD constructor. 73 | super->constructor( iv_name ). 74 | ENDMETHOD. 75 | 76 | METHOD add. 77 | APPEND io_shape TO li_shapes. 78 | ENDMETHOD. 79 | 80 | METHOD remove. 81 | DELETE li_shapes WHERE table_line EQ io_shape. 82 | ENDMETHOD. 83 | 84 | METHOD display. 85 | DATA: lo_shape TYPE REF TO lcl_shape. 86 | WRITE: / ''. 87 | DO indent TIMES. 88 | WRITE: (2) '-'. 89 | ENDDO. 90 | WRITE: v_name. 91 | DATA: lv_indent TYPE i. 92 | lv_indent = indent + 1. 93 | LOOP AT li_shapes INTO lo_shape. 94 | lo_shape->display( lv_indent ). 95 | ENDLOOP. 96 | ENDMETHOD. 97 | ENDCLASS. 98 | 99 | CLASS lcl_main DEFINITION. 100 | PUBLIC SECTION. 101 | CLASS-METHODS: run. 102 | ENDCLASS. 103 | * 104 | CLASS lcl_main IMPLEMENTATION. 105 | METHOD run. 106 | 107 | DATA: lo_pic TYPE REF TO lcl_shape. 108 | DATA: lo_shape TYPE REF TO lcl_shape. 109 | 110 | CREATE OBJECT lo_pic TYPE lcl_picture EXPORTING iv_name = 'Picture'. 111 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Left Line'. 112 | lo_pic->add( lo_shape ). 113 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Top Line'. 114 | lo_pic->add( lo_shape ). 115 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Right Line'. 116 | lo_pic->add( lo_shape ). 117 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Bottom Line'. 118 | lo_pic->add( lo_shape ). 119 | 120 | DATA: lo_pic2 TYPE REF TO lcl_shape. 121 | CREATE OBJECT lo_pic2 TYPE lcl_picture EXPORTING iv_name = 'Picture 2'. 122 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Left Line'. 123 | lo_pic2->add( lo_shape ). 124 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Top Line'. 125 | lo_pic2->add( lo_shape ). 126 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Right Line'. 127 | lo_pic2->add( lo_shape ). 128 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'Bottom Line'. 129 | lo_pic2->add( lo_shape ). 130 | lo_pic->add( lo_pic2 ). 131 | 132 | CREATE OBJECT lo_shape TYPE lcl_line EXPORTING iv_name = 'text'. 133 | lo_pic->add( lo_shape ). 134 | 135 | * Uniform way to access the composition - it could be a primitive object 136 | * or composition itself. 137 | lo_pic->display( 4 ). 138 | 139 | ENDMETHOD. 140 | ENDCLASS. 141 | * 142 | START-OF-SELECTION. 143 | lcl_main=>run( ). -------------------------------------------------------------------------------- /zdp_chainofresp.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_CHAINOFRESP 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_chainofresp. 9 | 10 | 11 | CLASS cl_abap_typedescr DEFINITION LOAD. 12 | 13 | DATA: moff TYPE I 14 | , slen TYPE I 15 | , mlen TYPE I. 16 | 17 | DEFINE get_clazz_name. 18 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 19 | FIND REGEX 'CLASS=' IN &2 MATCH OFFSET moff match LENGTH mlen. 20 | slen = moff + mlen. 21 | SHIFT &2 BY slen PLACES LEFT. 22 | END-OF-DEFINITION. 23 | 24 | CLASS HANDLER DEFINITION ABSTRACT. 25 | PUBLIC SECTION. 26 | METHODS: 27 | set_successor IMPORTING io_successor TYPE REF TO HANDLER 28 | , handle_request ABSTRACT IMPORTING iv_request TYPE I. 29 | 30 | PROTECTED SECTION. 31 | DATA: 32 | successor TYPE REF TO HANDLER. 33 | ENDCLASS. 34 | 35 | CLASS HANDLER IMPLEMENTATION. 36 | METHOD set_successor. 37 | me->successor = io_successor. 38 | ENDMETHOD. 39 | ENDCLASS. 40 | 41 | CLASS concrete_handler1 DEFINITION INHERITING FROM HANDLER. 42 | PUBLIC SECTION. 43 | METHODS: 44 | handle_request REDEFINITION. 45 | ENDCLASS. 46 | 47 | CLASS concrete_handler1 IMPLEMENTATION. 48 | METHOD handle_request. 49 | DATA: class_name TYPE abap_abstypename. 50 | get_clazz_name me class_name. 51 | 52 | IF ( iv_request >= 0 AND iv_request < 10 ). 53 | WRITE: / class_name, 'Handled request', iv_request. 54 | ELSEIF ( NOT successor IS INITIAL ). 55 | me->successor->handle_request( iv_request ). 56 | ENDIF. 57 | ENDMETHOD. 58 | ENDCLASS. 59 | 60 | CLASS concrete_handler2 DEFINITION INHERITING FROM HANDLER. 61 | PUBLIC SECTION. 62 | METHODS: 63 | handle_request REDEFINITION. 64 | ENDCLASS. 65 | 66 | CLASS concrete_handler2 IMPLEMENTATION. 67 | METHOD handle_request. 68 | DATA: class_name TYPE abap_abstypename. 69 | get_clazz_name me class_name. 70 | 71 | IF ( iv_request >= 10 AND iv_request < 20 ). 72 | WRITE: / class_name, 'Handled request', iv_request. 73 | ELSEIF ( NOT successor IS INITIAL ). 74 | me->successor->handle_request( iv_request ). 75 | ENDIF. 76 | ENDMETHOD. "handlerequest 77 | ENDCLASS. 78 | 79 | CLASS concrete_handler3 DEFINITION INHERITING FROM HANDLER. 80 | PUBLIC SECTION. 81 | METHODS: 82 | handle_request REDEFINITION. 83 | ENDCLASS. 84 | 85 | CLASS concrete_handler3 IMPLEMENTATION. 86 | METHOD handle_request. 87 | DATA: class_name TYPE abap_abstypename. 88 | get_clazz_name me class_name. 89 | 90 | IF ( iv_request >= 20 AND iv_request < 30 ). 91 | WRITE: / class_name, 'Handled request', iv_request. 92 | ELSEIF ( NOT successor IS INITIAL ). 93 | me->successor->handle_request( iv_request ). 94 | ENDIF. 95 | ENDMETHOD. "handlerequest 96 | ENDCLASS. 97 | 98 | CLASS lcl_application DEFINITION CREATE PRIVATE. 99 | PUBLIC SECTION. 100 | CLASS-METHODS: RUN. 101 | METHODS: constructor. 102 | PRIVATE SECTION. 103 | CLASS-DATA: so_application TYPE REF TO lcl_application. 104 | ENDCLASS. 105 | 106 | CLASS lcl_application IMPLEMENTATION. 107 | 108 | *---------------------------------------------------------- 109 | * LCL_APPLICATION->RUN(). 110 | *---------------------------------------------------------- 111 | METHOD RUN. 112 | DATA: 113 | exc_ref TYPE REF TO cx_root 114 | ,exc_text TYPE string. 115 | 116 | IF lcl_application=>so_application IS INITIAL. 117 | TRY. 118 | CREATE OBJECT lcl_application=>so_application. 119 | CATCH cx_sy_create_object_error INTO exc_ref. 120 | exc_text = exc_ref->get_text( ). 121 | MESSAGE exc_text TYPE 'I'. 122 | ENDTRY. 123 | ENDIF. 124 | ENDMETHOD. 125 | 126 | METHOD constructor. 127 | DATA: 128 | h1 TYPE REF TO concrete_handler1 129 | ,h2 TYPE REF TO concrete_handler2 130 | ,h3 TYPE REF TO concrete_handler3 131 | ,t_request TYPE TABLE OF I 132 | ,request TYPE I 133 | . 134 | 135 | * create objects 136 | CREATE OBJECT h1. 137 | CREATE OBJECT h2. 138 | CREATE OBJECT h3. 139 | 140 | h1->set_successor( h2 ). 141 | h2->set_successor( h3 ). 142 | 143 | INSERT 2 INTO TABLE t_request. 144 | INSERT 5 INTO TABLE t_request. 145 | INSERT 14 INTO TABLE t_request. 146 | INSERT 22 INTO TABLE t_request. 147 | INSERT 18 INTO TABLE t_request. 148 | INSERT 3 INTO TABLE t_request. 149 | INSERT 27 INTO TABLE t_request. 150 | INSERT 20 INTO TABLE t_request. 151 | 152 | LOOP AT t_request INTO request. 153 | h1->handle_request( request ). 154 | ENDLOOP. 155 | 156 | ENDMETHOD. "constructor 157 | 158 | ENDCLASS. 159 | 160 | START-OF-SELECTION. 161 | lcl_application=>run( ). -------------------------------------------------------------------------------- /zdp_state2.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_STATE2 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_state2. 9 | CLASS account DEFINITION DEFERRED. 10 | CLASS silverstate DEFINITION DEFERRED. 11 | 12 | CLASS state DEFINITION ABSTRACT. 13 | PUBLIC SECTION. 14 | METHODS: 15 | deposit ABSTRACT IMPORTING iv_amount TYPE d 16 | , withdraw ABSTRACT EXPORTING ev_amount TYPE d 17 | , payinterest ABSTRACT 18 | , get_account ABSTRACT RETURNING VALUE(ro_account) TYPE REF TO account 19 | , get_balance ABSTRACT RETURNING VALUE(rv_account) TYPE d 20 | , get_interest ABSTRACT RETURNING VALUE(rv_interest) TYPE d 21 | , get_lowerlimit ABSTRACT RETURNING VALUE(rv_lowerlimit) TYPE d 22 | , get_upperlimit ABSTRACT RETURNING VALUE(rv_upperlimit) TYPE d. 23 | PROTECTED SECTION. 24 | DATA: mo_account TYPE REF TO account 25 | , mv_balance TYPE d 26 | , mv_interest TYPE d 27 | , mv_lowerlimit TYPE d 28 | , mv_upperlimit TYPE d. 29 | ENDCLASS. 30 | 31 | CLASS account DEFINITION. 32 | PUBLIC SECTION. 33 | METHODS: 34 | get_account RETURNING VALUE(rv_account) TYPE string 35 | , set_account IMPORTING iv_account TYPE string 36 | , get_state RETURNING VALUE(ro_state) TYPE REF TO state 37 | , set_state IMPORTING io_state TYPE REF TO state. 38 | 39 | PRIVATE SECTION. 40 | DATA: mv_account TYPE string, 41 | mo_state TYPE REF TO state. 42 | ENDCLASS. 43 | 44 | CLASS account IMPLEMENTATION. 45 | METHOD get_state. 46 | ro_state = me->mo_state. 47 | ENDMETHOD. 48 | 49 | METHOD set_state. 50 | me->mo_state = io_state. 51 | ENDMETHOD. 52 | METHOD get_account. 53 | rv_account = me->mv_account. 54 | ENDMETHOD. 55 | 56 | METHOD set_account. 57 | me->mv_account = iv_account. 58 | ENDMETHOD. 59 | ENDCLASS. 60 | 61 | CLASS balance DEFINITION. 62 | PUBLIC SECTION. 63 | METHODS: 64 | get_balance RETURNING VALUE(rv_balance) TYPE d 65 | , set_balance IMPORTING iv_balance TYPE d. 66 | 67 | PRIVATE SECTION. 68 | DATA: mv_balance TYPE d. 69 | ENDCLASS. 70 | 71 | CLASS balance IMPLEMENTATION. 72 | METHOD get_balance. 73 | rv_balance = me->mv_balance. 74 | ENDMETHOD. 75 | 76 | METHOD set_balance. 77 | me->mv_balance = iv_balance. 78 | ENDMETHOD. 79 | ENDCLASS. 80 | 81 | CLASS redstate DEFINITION INHERITING FROM state. 82 | PUBLIC SECTION. 83 | METHODS: constructor IMPORTING io_state TYPE REF TO state, 84 | initialize, 85 | deposit REDEFINITION, 86 | withdraw REDEFINITION, 87 | payinterest REDEFINITION, 88 | get_account REDEFINITION, 89 | get_balance REDEFINITION, 90 | get_interest REDEFINITION, 91 | get_lowerlimit REDEFINITION, 92 | get_upperlimit REDEFINITION. 93 | 94 | PRIVATE SECTION. 95 | METHODS: statechangecheck. 96 | DATA: mv_servicefee. 97 | ENDCLASS. 98 | 99 | CLASS redstate IMPLEMENTATION. 100 | METHOD constructor. 101 | super->constructor( ). 102 | me->mv_balance = io_state->mv_balance. 103 | me->mo_account = NEW account( ). 104 | me->initialize( ). 105 | ENDMETHOD. 106 | 107 | METHOD initialize. 108 | me->mv_interest = 0. 109 | me->mv_lowerlimit = -100. 110 | me->mv_upperlimit = 0. 111 | me->mv_servicefee = 15. 112 | ENDMETHOD. 113 | 114 | METHOD deposit. 115 | me->mv_balance = me->mv_balance + iv_amount. 116 | me->statechangecheck( ). 117 | ENDMETHOD. 118 | 119 | METHOD withdraw. 120 | ev_amount = ev_amount - me->mv_servicefee. 121 | WRITE: / 'No funds available for withdrawal!'. 122 | ENDMETHOD. 123 | 124 | METHOD payinterest. 125 | ENDMETHOD. 126 | 127 | METHOD statechangecheck. 128 | IF mv_balance > mv_upperlimit. 129 | DATA: m_silverstate TYPE REF TO silverstate. 130 | CREATE OBJECT m_silverstate. 131 | mv_account->set_state( io_state = m_silverstate). 132 | ENDIF. 133 | ENDMETHOD. 134 | 135 | METHOD get_balance. 136 | rv_balance = me->mv_balance. 137 | ENDMETHOD. 138 | 139 | METHOD get_interest. 140 | rv_interest = me->mv_interest. 141 | ENDMETHOD. 142 | 143 | METHOD get_account. 144 | ro_account = me->mo_account. 145 | ENDMETHOD. 146 | 147 | METHOD get_lowerlimit. 148 | rv_lowerlimit = me->mv_lowerlimit. 149 | ENDMETHOD. 150 | 151 | METHOD get_upperlimit. 152 | rv_upperlimit = me->mv_upperlimit. 153 | ENDMETHOD. 154 | ENDCLASS. 155 | 156 | CLASS silverstate DEFINITION INHERITING FROM state. 157 | PUBLIC SECTION. 158 | METHODS: 159 | constructor IMPORTING io_state TYPE REF TO state OPTIONAL 160 | iv_balance TYPE d OPTIONAL 161 | io_account TYPE REF TO account OPTIONAL. 162 | ENDCLASS. 163 | 164 | CLASS silverstate IMPLEMENTATION. 165 | IF io_state IS INITIAL. 166 | me->mv_balance = io_state->get_balance( ). 167 | me->mo_account = io_state->get_account( ). 168 | ELSE. 169 | me->mv_balance = iv_balance. 170 | me->mo_account = io_account. 171 | ENDIF. 172 | ENDCLASS. -------------------------------------------------------------------------------- /zdp_factorymethod3.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_FACTORYMETHOD3 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_factorymethod3 NO STANDARD PAGE HEADING LINE-SIZE 80. 9 | 10 | CLASS cl_abap_typedescr DEFINITION LOAD. 11 | 12 | DATA: moff TYPE i 13 | , slen TYPE i 14 | , mlen TYPE i. 15 | 16 | DEFINE get_clazz_name. 17 | &2 = cl_abap_classdescr=>get_class_name( &1 ). 18 | find REGEX 'CLASS=' in &2 MATCH OFFSET moff MATCH LENGTH mlen. 19 | slen = moff + mlen. 20 | SHIFT &2 by slen PLACES LEFT. 21 | END-OF-DEFINITION. 22 | 23 | CLASS page DEFINITION ABSTRACT. 24 | ENDCLASS. 25 | 26 | CLASS skillspage DEFINITION INHERITING FROM page. 27 | ENDCLASS. 28 | 29 | CLASS educationpage DEFINITION INHERITING FROM page. 30 | ENDCLASS. 31 | 32 | CLASS experiencepage DEFINITION INHERITING FROM page. 33 | ENDCLASS. 34 | 35 | CLASS introductionpage DEFINITION INHERITING FROM page. 36 | ENDCLASS. 37 | 38 | CLASS resultspage DEFINITION INHERITING FROM page. 39 | ENDCLASS. 40 | 41 | CLASS conclusionpage DEFINITION INHERITING FROM page. 42 | ENDCLASS. 43 | 44 | CLASS summarypage DEFINITION INHERITING FROM page. 45 | ENDCLASS. 46 | 47 | CLASS bibliographypage DEFINITION INHERITING FROM page. 48 | ENDCLASS. 49 | 50 | CLASS document DEFINITION ABSTRACT. 51 | PUBLIC SECTION. 52 | METHODS: 53 | createpages ABSTRACT 54 | , pages EXPORTING pages TYPE ANY TABLE. 55 | 56 | PROTECTED SECTION. 57 | DATA: 58 | oa_pages_coll TYPE TABLE OF REF TO page. 59 | ENDCLASS. 60 | 61 | CLASS document IMPLEMENTATION. 62 | METHOD pages. 63 | pages[] = oa_pages_coll[]. 64 | ENDMETHOD. 65 | ENDCLASS. 66 | 67 | CLASS resume DEFINITION INHERITING FROM document. 68 | PUBLIC SECTION. 69 | METHODS: 70 | constructor 71 | , createpages REDEFINITION. 72 | ENDCLASS. 73 | 74 | CLASS resume IMPLEMENTATION. 75 | METHOD constructor. 76 | super->constructor( ). 77 | CALL METHOD me->createpages. 78 | ENDMETHOD. 79 | 80 | METHOD createpages. 81 | DATA: page TYPE REF TO page. 82 | CREATE OBJECT page TYPE skillspage. 83 | APPEND page TO oa_pages_coll. 84 | 85 | CREATE OBJECT page TYPE educationpage. 86 | APPEND page TO oa_pages_coll. 87 | 88 | CREATE OBJECT page TYPE experiencepage. 89 | APPEND page TO oa_pages_coll. 90 | ENDMETHOD. 91 | ENDCLASS. 92 | 93 | CLASS report DEFINITION INHERITING FROM document. 94 | PUBLIC SECTION. 95 | METHODS: 96 | constructor 97 | , createpages REDEFINITION. 98 | ENDCLASS. 99 | 100 | CLASS report IMPLEMENTATION. 101 | METHOD constructor. 102 | super->constructor( ). 103 | CALL METHOD me->createpages. 104 | ENDMETHOD. 105 | 106 | METHOD createpages. 107 | DATA: page TYPE REF TO page. 108 | CREATE OBJECT page TYPE introductionpage. 109 | APPEND page TO oa_pages_coll. 110 | 111 | CREATE OBJECT page TYPE resultspage. 112 | APPEND page TO oa_pages_coll. 113 | 114 | CREATE OBJECT page TYPE conclusionpage. 115 | APPEND page TO oa_pages_coll. 116 | 117 | CREATE OBJECT page TYPE summarypage. 118 | APPEND page TO oa_pages_coll. 119 | 120 | CREATE OBJECT page TYPE bibliographypage. 121 | APPEND page TO oa_pages_coll. 122 | ENDMETHOD. 123 | ENDCLASS. 124 | 125 | CLASS mainapp DEFINITION. 126 | PUBLIC SECTION. 127 | CLASS-DATA: oa_document_coll TYPE TABLE OF REF TO document. 128 | CLASS-METHODS main. 129 | ENDCLASS. 130 | 131 | CLASS mainapp IMPLEMENTATION. 132 | METHOD main. 133 | DATA: document TYPE REF TO document 134 | ,resume TYPE REF TO resume 135 | ,report TYPE REF TO report 136 | ,page TYPE REF TO page 137 | ,class_name TYPE abap_abstypename 138 | ,pages_coll TYPE TABLE OF REF TO page. 139 | . 140 | FIELD-SYMBOLS: TYPE REF TO document 141 | , TYPE REF TO page. 142 | 143 | CREATE OBJECT resume. 144 | APPEND resume TO oa_document_coll. 145 | 146 | CREATE OBJECT report. 147 | APPEND report TO oa_document_coll. 148 | 149 | * Loop at all documents 150 | LOOP AT oa_document_coll ASSIGNING . 151 | * Call macro to find out which Creator and Product are active 152 | get_clazz_name class_name. 153 | CASE class_name. 154 | WHEN 'RESUME'. 155 | WRITE: / 'Resume contains following pages:', / sy-uline. 156 | CALL METHOD ->pages( IMPORTING pages = pages_coll ). 157 | * Loop at all pages in document Resume 158 | LOOP AT pages_coll ASSIGNING . 159 | get_clazz_name class_name. 160 | WRITE: / class_name. 161 | ENDLOOP. 162 | WHEN 'REPORT'. 163 | WRITE: / 'Report contains following pages:', / sy-uline. 164 | CALL METHOD ->pages( IMPORTING pages = pages_coll ). 165 | * Loop at all pages in document Resume 166 | LOOP AT pages_coll ASSIGNING . 167 | get_clazz_name class_name. 168 | WRITE: / class_name. 169 | ENDLOOP. 170 | ENDCASE. 171 | ENDLOOP. 172 | 173 | ENDMETHOD. "main 174 | ENDCLASS. "mainapp IMPLEMENTATION 175 | 176 | START-OF-SELECTION. 177 | mainapp=>main( ). -------------------------------------------------------------------------------- /zdp_iterator.abap: -------------------------------------------------------------------------------- 1 | *&---------------------------------------------------------------------* 2 | *& Report ZDP_ITERATOR 3 | *& 4 | *&---------------------------------------------------------------------* 5 | *& 6 | *& 7 | *&---------------------------------------------------------------------* 8 | REPORT zdp_iterator. 9 | 10 | 11 | CLASS lcl_item DEFINITION. 12 | PUBLIC SECTION. 13 | METHODS: constructor IMPORTING iv_name TYPE string. 14 | DATA: v_name TYPE string READ-ONLY. 15 | ENDCLASS. 16 | 17 | CLASS lcl_item IMPLEMENTATION. 18 | METHOD constructor. 19 | v_name = iv_name. 20 | ENDMETHOD. 21 | ENDCLASS. 22 | 23 | INTERFACE if_collection DEFERRED. 24 | 25 | INTERFACE if_iterator. 26 | METHODS: get_index RETURNING VALUE(index) TYPE i, 27 | has_next RETURNING VALUE(has_next) TYPE flag, 28 | get_next RETURNING VALUE(object) TYPE REF TO object, 29 | first RETURNING VALUE(object) TYPE REF TO object, 30 | set_step IMPORTING VALUE(iv_step) TYPE i. 31 | DATA: v_step TYPE i. 32 | DATA: v_current TYPE i. 33 | DATA: o_collection TYPE REF TO if_collection. 34 | ENDINTERFACE. 35 | 36 | INTERFACE if_collection. 37 | METHODS: get_iterator RETURNING VALUE(iterator) TYPE REF TO if_iterator. 38 | METHODS: add IMPORTING element TYPE REF TO object, 39 | remove IMPORTING element TYPE REF TO object, 40 | clear, 41 | size RETURNING VALUE(size) TYPE i, 42 | is_empty RETURNING VALUE(empty) TYPE flag, 43 | get IMPORTING index TYPE i 44 | RETURNING VALUE(object) TYPE REF TO object. 45 | ENDINTERFACE. 46 | 47 | CLASS lcl_iterator DEFINITION. 48 | PUBLIC SECTION. 49 | INTERFACES: if_iterator. 50 | METHODS: constructor IMPORTING io_collection TYPE REF TO if_collection. 51 | ALIASES: get_index FOR if_iterator~get_index, 52 | has_next FOR if_iterator~has_next, 53 | get_next FOR if_iterator~get_next, 54 | first FOR if_iterator~first, 55 | set_step FOR if_iterator~set_step. 56 | 57 | PRIVATE SECTION. 58 | ALIASES: v_step FOR if_iterator~v_step, 59 | v_current FOR if_iterator~v_current, 60 | o_collection FOR if_iterator~o_collection. 61 | ENDCLASS. 62 | 63 | CLASS lcl_collection DEFINITION. 64 | PUBLIC SECTION. 65 | INTERFACES: if_collection. 66 | DATA: i_items TYPE STANDARD TABLE OF REF TO object. 67 | ALIASES: get_iterator FOR if_collection~get_iterator, 68 | add FOR if_collection~add, 69 | remove FOR if_collection~clear, 70 | clear FOR if_collection~size, 71 | size FOR if_collection~is_empty, 72 | get FOR if_collection~get. 73 | ENDCLASS. 74 | 75 | CLASS lcl_collection IMPLEMENTATION. 76 | METHOD if_collection~get_iterator. 77 | CREATE OBJECT iterator 78 | TYPE lcl_iterator 79 | EXPORTING 80 | io_collection = me. 81 | ENDMETHOD. 82 | 83 | METHOD if_collection~add. 84 | APPEND element TO i_items. 85 | ENDMETHOD. 86 | 87 | METHOD if_collection~remove. 88 | DELETE i_items WHERE table_line EQ element. 89 | ENDMETHOD. 90 | 91 | METHOD if_collection~clear. 92 | CLEAR: i_items. 93 | ENDMETHOD. 94 | 95 | METHOD if_collection~size. 96 | size = lines( i_items ). 97 | ENDMETHOD. 98 | 99 | METHOD if_collection~is_empty. 100 | IF me->size( ) IS INITIAL. 101 | empty = 'X'. 102 | ENDIF. 103 | ENDMETHOD. 104 | 105 | METHOD if_collection~get. 106 | READ TABLE i_items INTO object INDEX index. 107 | ENDMETHOD. 108 | ENDCLASS. 109 | 110 | CLASS lcl_iterator IMPLEMENTATION. 111 | METHOD constructor. 112 | o_collection = io_collection. 113 | v_step = 1. 114 | ENDMETHOD. 115 | 116 | METHOD if_iterator~first. 117 | v_current = 1. 118 | object = o_collection->get( v_current ). 119 | ENDMETHOD. 120 | 121 | METHOD if_iterator~get_next. 122 | v_current = v_current + v_step. 123 | object = o_collection->get( v_current ). 124 | ENDMETHOD. 125 | 126 | METHOD if_iterator~has_next. 127 | DATA obj TYPE REF TO object. 128 | DATA idx TYPE i. 129 | idx = v_current + v_step. 130 | obj = o_collection->get( idx ). 131 | IF obj IS BOUND. 132 | has_next = 'X'. 133 | ENDIF. 134 | ENDMETHOD. 135 | 136 | METHOD if_iterator~set_step. 137 | me->v_step = iv_step. 138 | ENDMETHOD. 139 | 140 | METHOD if_iterator~get_index. 141 | index = index. 142 | ENDMETHOD. 143 | ENDCLASS. 144 | 145 | CLASS lcl_main DEFINITION. 146 | PUBLIC SECTION. 147 | CLASS-METHODS:run. 148 | ENDCLASS. 149 | 150 | CLASS lcl_main IMPLEMENTATION. 151 | METHOD run. 152 | DATA: o_collection TYPE REF TO if_collection. 153 | DATA: o_iterator TYPE REF TO if_iterator. 154 | DATA: lo_item TYPE REF TO lcl_item. 155 | 156 | CREATE OBJECT o_collection TYPE lcl_collection. 157 | o_iterator = o_collection->get_iterator( ). 158 | 159 | CREATE OBJECT lo_item 160 | EXPORTING 161 | iv_name = 'Item1'. 162 | o_collection->add( lo_item ). 163 | 164 | CREATE OBJECT lo_item 165 | EXPORTING 166 | iv_name = 'Item2'. 167 | o_collection->add( lo_item ). 168 | 169 | CREATE OBJECT lo_item 170 | EXPORTING 171 | iv_name = 'Item3'. 172 | o_collection->add( lo_item ). 173 | 174 | CREATE OBJECT lo_item 175 | EXPORTING 176 | iv_name = 'Item4'. 177 | o_collection->add( lo_item ). 178 | 179 | CREATE OBJECT lo_item 180 | EXPORTING 181 | iv_name = 'Item5'. 182 | o_collection->add( lo_item ). 183 | 184 | WHILE o_iterator->has_next( ) IS NOT INITIAL. 185 | lo_item ?= o_iterator->get_next( ). 186 | WRITE: / lo_item->v_name. 187 | ENDWHILE. 188 | ENDMETHOD. 189 | ENDCLASS. 190 | 191 | START-OF-SELECTION. 192 | lcl_main=>run( ). --------------------------------------------------------------------------------