• 首页
  • 栏目
  • ERP
  • 【学习笔记】ABAP OOD设计模式 - 观察者模式

【学习笔记】ABAP OOD设计模式 - 观察者模式

  • 2021-11-30
  • Admin

ABAP OOD设计模式 - 观察者模式

整理转自—《SAP ABAP 面向对象程序设计(原则、模式及实践)》

定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,这个对象相关依赖的所有对象都可以得到通知并能够自动更新的行为模式就成为观察者模式(Observer Pattern),观察者模式属于行为型模式。

效果:观察者模式将观察者和被观察者解耦,被观察者可以按需要增加或者删除观察者,并能够将变化及时通知给所有相关的观察者。

【示例】

比如工厂库存消耗后低于一定量会触发再订货点,邮件通知各采购处联系人备货。

创建接口“ZIF_PURCHASING_GROUP”的属性和方法。

创建实现接口“ZIF_PURCHASING_GROUP”的类“ZCL_PURCHASING_GROUP_PL01”,并为继承的方法“UPDATE_TASK_STATUS”添加代码。

创建可继承的抽象类“ZCL_INVENTORY_MGMT”,定义结构体和表类型,类属性“MT_PURCHASING_GROUP”为内表变量,用于记录观察者。

添加类方法“ATTACH”,用于添加观察者。

添加类方法“DELETE”,用于删除观察者。

添加类方法“NOTIFY”,用于通知所有观察者。

创建继承类“ZCL_INVENTORY_MGMT_PL01”,继承上面的抽象类“ZCL_INVENTORY_MGMT”,并重新定义父类的方法“NOTIFY”。

添加测试程序。

  1. *&---------------------------------------------------------------------*
  2. *& Report  ZREP_CLS_C03
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *&
  6. *&
  7. *&---------------------------------------------------------------------*
  8. REPORT ZREP_CLS_C03.
  9. DATA : EXC_REF TYPE REF TO CX_ROOT,
  10.        EXC_TEXT TYPE STRING.
  11. DATA : GO_INV_MGMT_PL01 TYPE REF TO ZCL_INVENTORY_MGMT_PL01,
  12.        GO_PURCH_GROUP_PL01 TYPE REF TO ZCL_PURCHASING_GROUP_PL01,
  13.        GV_GROUP_ID TYPE STRING,
  14.        GT_GROUP_ID TYPE STANDARD TABLE OF STRING.
  15. TRY.
  16.     "模拟读取Purchase Group信息
  17.     GV_GROUP_ID = '1001'.
  18.     INSERT GV_GROUP_ID INTO TABLE GT_GROUP_ID.
  19.     GV_GROUP_ID = '2001'.
  20.     INSERT GV_GROUP_ID INTO TABLE GT_GROUP_ID.
  21.     GV_GROUP_ID = '3001'.
  22.     INSERT GV_GROUP_ID INTO TABLE GT_GROUP_ID.
  23.     CREATE OBJECT GO_INV_MGMT_PL01.
  24.     "循环创建Purchase Group对象,注册到库存管理被观察者对象中。
  25.     LOOP AT GT_GROUP_ID INTO GV_GROUP_ID.
  26.       CREATE OBJECT GO_PURCH_GROUP_PL01.
  27.       GO_PURCH_GROUP_PL01->ZIF_PURCHASING_GROUP~GROUP_ID = GV_GROUP_ID.
  28.       GO_INV_MGMT_PL01->ATTACH( GO_PURCH_GROUP_PL01 ).
  29.       FREE GO_PURCH_GROUP_PL01.
  30.     ENDLOOP.
  31.     "库存发生变化时,通知相关的观察者进行处理
  32.     GO_INV_MGMT_PL01->NOTIFY( 'Re-order 2021-11-30' ).
  33.     SKIP 2.
  34.     "删除一个观察者
  35.     GO_INV_MGMT_PL01->DELETE( '1001' ).
  36.     SKIP 2.
  37.     "库存再次发生变化时,通知相关的观察者进行处理
  38.     GO_INV_MGMT_PL01->NOTIFY( 'Re-order 2021-12-20' ).
  39.     
  40.   CATCH CX_SY_CREATE_OBJECT_ERROR INTO EXC_REF.
  41.     EXC_TEXT = EXC_REF->GET_TEXT( ).
  42.     WRITE : / EXC_TEXT.
  43. ENDTRY.

【示例】

利用ABAP的事件(Event)功能,也能得到同样的效果。

创建被观察者类“ZCL_SUBJECT”,创建事件“STATUS_CHANGED”,创建方法“CHANGE_STATUS”,在方法中引发该事件。

创建观察者类“ZCL_OBSERVER”,并添加方法“ACTION_ON_SUBJECT_CHANGED”,在“细目视图”中设定该方法是被观察者类“ZCL_SUBJECT”的事件“STATUS_CHANGED”的处理方法。

添加测试程序。

  1. *&---------------------------------------------------------------------*
  2. *& Report  ZREP_CLS_C04
  3. *&
  4. *&---------------------------------------------------------------------*
  5. *&
  6. *&
  7. *&---------------------------------------------------------------------*
  8. REPORT ZREP_CLS_C04.
  9. DATA : GO_SUBJECT TYPE REF TO ZCL_SUBJECT,
  10.        GO_OBSERVER1 TYPE REF TO ZCL_OBSERVER,
  11.        GO_OBSERVER2 TYPE REF TO ZCL_OBSERVER.
  12. "创建被观察者对象
  13. CREATE OBJECT GO_SUBJECT.
  14. "创建观察者对象
  15. CREATE OBJECT GO_OBSERVER1.
  16. CREATE OBJECT GO_OBSERVER2.
  17. "设定观察者的事件句柄指向被观察者
  18. SET HANDLER GO_OBSERVER1->ACTION_ON_SUBJECT_CHANGED FOR GO_SUBJECT.
  19. SET HANDLER GO_OBSERVER2->ACTION_ON_SUBJECT_CHANGED FOR GO_SUBJECT.
  20. "被观察者状态改变
  21. GO_SUBJECT->CHANGE_STATUS( ).

原文:https://blog.csdn.net/zhongguomao/article/details/121642716

联系站长

QQ:769220720