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.
运行结果:
本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!