【学习笔记】ABAP OOD设计模式 - 观察者模式
ABAP OOD設(shè)計(jì)模式 - 觀察者模式
整理轉(zhuǎn)自—《SAP ABAP 面向?qū)ο蟪绦蛟O(shè)計(jì)(原則、模式及實(shí)踐)》
定義對(duì)象間的一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),這個(gè)對(duì)象相關(guān)依賴的所有對(duì)象都可以得到通知并能夠自動(dòng)更新的行為模式就成為觀察者模式(Observer Pattern),觀察者模式屬于行為型模式。
效果:觀察者模式將觀察者和被觀察者解耦,被觀察者可以按需要增加或者刪除觀察者,并能夠?qū)⒆兓皶r(shí)通知給所有相關(guān)的觀察者。
【示例】
比如工廠庫(kù)存消耗后低于一定量會(huì)觸發(fā)再訂貨點(diǎn),郵件通知各采購(gòu)處聯(lián)系人備貨。
創(chuàng)建接口“ZIF_PURCHASING_GROUP”的屬性和方法。
創(chuàng)建實(shí)現(xiàn)接口“ZIF_PURCHASING_GROUP”的類“ZCL_PURCHASING_GROUP_PL01”,并為繼承的方法“UPDATE_TASK_STATUS”添加代碼。
創(chuàng)建可繼承的抽象類“ZCL_INVENTORY_MGMT”,定義結(jié)構(gòu)體和表類型,類屬性“MT_PURCHASING_GROUP”為內(nèi)表變量,用于記錄觀察者。
添加類方法“ATTACH”,用于添加觀察者。
添加類方法“DELETE”,用于刪除觀察者。
添加類方法“NOTIFY”,用于通知所有觀察者。
創(chuàng)建繼承類“ZCL_INVENTORY_MGMT_PL01”,繼承上面的抽象類“ZCL_INVENTORY_MGMT”,并重新定義父類的方法“NOTIFY”。
添加測(cè)試程序。
*&---------------------------------------------------------------------* *&?Report??ZREP_CLS_C03 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------*REPORT?ZREP_CLS_C03.DATA?:?EXC_REF?TYPE?REF?TO?CX_ROOT,EXC_TEXT?TYPE?STRING. DATA?:?GO_INV_MGMT_PL01?TYPE?REF?TO?ZCL_INVENTORY_MGMT_PL01,GO_PURCH_GROUP_PL01?TYPE?REF?TO?ZCL_PURCHASING_GROUP_PL01,GV_GROUP_ID?TYPE?STRING,GT_GROUP_ID?TYPE?STANDARD?TABLE?OF?STRING.TRY."模擬讀取Purchase?Group信息GV_GROUP_ID?=?'1001'.INSERT?GV_GROUP_ID?INTO?TABLE?GT_GROUP_ID.GV_GROUP_ID?=?'2001'.INSERT?GV_GROUP_ID?INTO?TABLE?GT_GROUP_ID.GV_GROUP_ID?=?'3001'.INSERT?GV_GROUP_ID?INTO?TABLE?GT_GROUP_ID.CREATE?OBJECT?GO_INV_MGMT_PL01."循環(huán)創(chuàng)建Purchase?Group對(duì)象,注冊(cè)到庫(kù)存管理被觀察者對(duì)象中。LOOP?AT?GT_GROUP_ID?INTO?GV_GROUP_ID.CREATE?OBJECT?GO_PURCH_GROUP_PL01.GO_PURCH_GROUP_PL01->ZIF_PURCHASING_GROUP~GROUP_ID?=?GV_GROUP_ID.GO_INV_MGMT_PL01->ATTACH(?GO_PURCH_GROUP_PL01?).FREE?GO_PURCH_GROUP_PL01.ENDLOOP."庫(kù)存發(fā)生變化時(shí),通知相關(guān)的觀察者進(jìn)行處理GO_INV_MGMT_PL01->NOTIFY(?'Re-order?2021-11-30'?).SKIP?2."刪除一個(gè)觀察者GO_INV_MGMT_PL01->DELETE(?'1001'?).SKIP?2."庫(kù)存再次發(fā)生變化時(shí),通知相關(guān)的觀察者進(jìn)行處理GO_INV_MGMT_PL01->NOTIFY(?'Re-order?2021-12-20'?).CATCH?CX_SY_CREATE_OBJECT_ERROR?INTO?EXC_REF.EXC_TEXT?=?EXC_REF->GET_TEXT(?).WRITE?:?/?EXC_TEXT. ENDTRY.【示例】
利用ABAP的事件(Event)功能,也能得到同樣的效果。
創(chuàng)建被觀察者類“ZCL_SUBJECT”,創(chuàng)建事件“STATUS_CHANGED”,創(chuàng)建方法“CHANGE_STATUS”,在方法中引發(fā)該事件。
創(chuàng)建觀察者類“ZCL_OBSERVER”,并添加方法“ACTION_ON_SUBJECT_CHANGED”,在“細(xì)目視圖”中設(shè)定該方法是被觀察者類“ZCL_SUBJECT”的事件“STATUS_CHANGED”的處理方法。
添加測(cè)試程序。
*&---------------------------------------------------------------------* *&?Report??ZREP_CLS_C04 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------*REPORT?ZREP_CLS_C04.DATA?:?GO_SUBJECT?TYPE?REF?TO?ZCL_SUBJECT,GO_OBSERVER1?TYPE?REF?TO?ZCL_OBSERVER,GO_OBSERVER2?TYPE?REF?TO?ZCL_OBSERVER."創(chuàng)建被觀察者對(duì)象 CREATE?OBJECT?GO_SUBJECT."創(chuàng)建觀察者對(duì)象 CREATE?OBJECT?GO_OBSERVER1. CREATE?OBJECT?GO_OBSERVER2."設(shè)定觀察者的事件句柄指向被觀察者 SET?HANDLER?GO_OBSERVER1->ACTION_ON_SUBJECT_CHANGED?FOR?GO_SUBJECT. SET?HANDLER?GO_OBSERVER2->ACTION_ON_SUBJECT_CHANGED?FOR?GO_SUBJECT."被觀察者狀態(tài)改變 GO_SUBJECT->CHANGE_STATUS(?).總結(jié)
以上是生活随笔為你收集整理的【学习笔记】ABAP OOD设计模式 - 观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【学习笔记】ABAP OOD设计模式 -
- 下一篇: 【学习笔记】ABAP OOD设计模式 -