ABAP设计模式之---“预留出口类(Callback Class)”

1. 目的

增强程序的扩展性。

2. 使用场景

类比:

  • 这个设计模式可以和食物类比。预留的出口类,类似于我们购买的半成品食物,消费者节省了自己从买菜、洗菜、切菜等步骤,对于半成品食物,消费者可以根据自己的口味,稍加调整即可食用。

解析:

  • 提取通用的逻辑到Central Class中(Main Class),并在Central Class中预留出口,这样增加程序设计灵活性和可定制性,
  • SAP系统中的BAdI就是这种模式的一个很好的应用
  • 此模式常用于“框架结构设计”阶段

体现的设计原则有:

  • 开放封闭原则 - 稳定的核心功能;但在不同的场景下,可以有多种不同的出口类

3. 类图

在这里插入图片描述

4. 代码实现

在下例中,通用的逻辑提取到lcl_salary_calculator中,并预留了lif_calculator接口。

在不同场景下使用lcl_salary_calculator时,可以通过接口lif_calculator来实现定制化的逻辑。

REPORT ztest_callback_pattern.
**********************************************************************
* callback interface
**********************************************************************
INTERFACE lif_calculator.
  METHODS calculate_overtime_pay
    IMPORTING iv_staff_id      TYPE char10 OPTIONAL
    RETURNING VALUE(rv_amount) TYPE i.
  METHODS calculate_special_bouns
    IMPORTING iv_staff_id      TYPE char10 OPTIONAL
    RETURNING VALUE(rv_amount) TYPE i.
ENDINTERFACE.

**********************************************************************
* main class
**********************************************************************
CLASS lcl_salary_calculator DEFINITION FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    METHODS constructor
      IMPORTING io_calculator TYPE REF TO lif_calculator.
    METHODS get_monthly_salary
      IMPORTING iv_staff_id      TYPE char10 OPTIONAL
      RETURNING VALUE(rv_amount) TYPE i.
    METHODS get_bounds
      IMPORTING iv_staff_id      TYPE char10 OPTIONAL
      RETURNING VALUE(rv_amount) TYPE i.

  PRIVATE SECTION.
    DATA mo_callback_calculator TYPE REF TO lif_calculator.
ENDCLASS.

CLASS lcl_salary_calculator IMPLEMENTATION.
  METHOD constructor.
    mo_callback_calculator = io_calculator.
  ENDMETHOD.

  METHOD get_bounds.
    DATA(lv_base_bouns) = mo_callback_calculator->calculate_overtime_pay( iv_staff_id ).
    rv_amount = lv_base_bouns + 500.
  ENDMETHOD.

  METHOD get_monthly_salary.
    DATA(lv_base_salary) = mo_callback_calculator->calculate_overtime_pay( iv_staff_id ).
    rv_amount = lv_base_salary + 3000.
  ENDMETHOD.
ENDCLASS.
**********************************************************************
* callback class
**********************************************************************
CLASS lcl_hr_calculator_clbk DEFINITION FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES lif_calculator.
ENDCLASS.

CLASS lcl_hr_calculator_clbk IMPLEMENTATION.
  METHOD lif_calculator~calculate_overtime_pay.
    rv_amount = 1000.
  ENDMETHOD.

  METHOD lif_calculator~calculate_special_bouns.
    rv_amount = 200.
  ENDMETHOD.
ENDCLASS.
**********************************************************************
START-OF-SELECTION.
**********************************************************************
  DATA(lo_hr_salary) = NEW lcl_salary_calculator(
                             io_calculator = NEW lcl_hr_calculator_clbk( ) ).

  DATA(lv_month_salary) = lo_hr_salary->get_monthly_salary(  ).

  WRITE 'Month salary is:' && lv_month_salary.

运行结果:
在这里插入图片描述

本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值