SAP BADI 實現原理解析

2021-05-08 18:38:50 字數 2742 閱讀 5868

最近幾天發現這篇文章被單擊的次數比較高, 這裡把文件內容再充實一下:

本文談得是sap badi

機制背後的一些設計問題, 關於如何使用badi

請參考:

...在sap系統中 badi

相關類的 類圖 如下:

下面能過**分析 badi

機制背後的一些設計問題:

1. 定義指向badi

inte***ce的reference

data: exit_ref type ref to zif_ex_badi.

2. 獲得繼承badi

inte***ce的子類例項

call method cl_exithandler=>get_instance

changing

instance = exit_ref.

這裡的cl_exithandler=>get_instance方法是乙個簡化的abstract factory.

a) 為什麼說它是個簡化的abstract factory呢? 因為cl_exithandler沒有乙個抽象的工廠類, 只有乙個產品簇, 只完成單一的建立工作。

b) 為什麼不說它是個factory method? 是因為它沒把類的建立工作延遲到子類。

c) 為什麼cl_exithandler=>get_instance要用工廠模式呢?

在client**端看來,通過呼叫get_instance這個方法就可以得到具體實現類例項,然後呼叫下面的方法:

call method exit_ref->custom_validation

importing

param = '***'

exporting

flt_val = '***'.

就呼叫到實現類中的介面方法了。

但通過debug**你會發現這個呼叫返回的是adapter class 'zcl_ex_badi'而非我們的impl class!

其實這就是建立型模式的意義 - 隱藏物件的建立細節.

也就是說當我們呼叫custom_validation時,其實是呼叫了zcl_ex_badi->custom_validation.

3. zcl_ex_badi->custom_validation,這個方法是sap系統自動生成的,核心**如下:

...

loop at instance_badi_table assigning 

where method_name  = 'display'.   

endloop.   

...

loop at exit_obj_tab assigning 

where active   = sxrt_true.   

check -imp_class ne old_imp_class.   

-valid = sxrt_true.   

flt_val_db = -flt_val.   

...   

move -imp_class to -imp_class.   

move -imp_switch to -imp_switch.   

move -order_num to -order_num.   

insert into table instance_flt_cache.   

old_imp_class = -imp_class.   

endloop.   

...

loop at instance_flt_cache assigning    

where flt_name    = flt_name   

and valid       = sxrt_true   

and method_name = 'custom_validation'.   

...   

call method ('cl_fobu_method_evaluation')=>load   

exporting   

im_class_name     = -imp_class   

im_inte***ce_name = 'zif_ex_badi'   

im_method_name    = 'custom_validation'   

receiving   

re_fobu_method    = -eo_object   

exceptions   

not_found         = 1

others            = 2.   

...   

endloop.  

這時我們會發現這段**會找到所有active的badi

implemention然後去執行它。這裡有點adpater的味道而且在sap標準文件中確實是把zcl_ex_badi 類為adapter class, 但是我覺得這個叫法不合適,改變介面不是這個類的主要價值,裡面的loop呼叫實現類方法和filter顯得更主要。所以它的主要價值應該是對實現類的訪問控制,改稱adapter class為 proxy或許更合適。下面是proxy模式的類圖:

關於proxy模式, 《head first design pattern》中講的非常不錯,這裡推薦一下。

總結:1. 通過 factory 獲得adapter class 的例項 (障眼法 / 封裝建立細節)

2. 通過 proxy 物件(adapter class) 實現對 badi

implementations 的訪問控制

c c const實現原理解析

丟擲問題 下列 輸出的結果是什麼?include includeusing namespace std int main resault 100 10講解學習 原理在c 中,被const修飾的變數,可能為其分配儲存空間,也可能不分配儲存空間。有下面兩種情況,會為這個變數分配儲存空間 1 當const...

Ogre陰影實現原理解析

顧名思義,陰影錐陰影其實就是建立乙個椎體。我們以光源位置為起點,和需要產生陰影的物體的外圍輪廓 光源作為參考位置 連線然後無限延伸,這樣就得到了乙個椎體,利用這個椎體做模板測試。我們把面對攝像機為正面的椎體麵先繪製一遍,在相應的模板位置 1 我們把背對攝像機為反面的椎體面再繪製一遍,在相應的模板位置...

耦合實現Spring IOC原理解析

文章結束給大家來個程式設計師笑話 m 首先恭喜守巨集同學找到了自己心儀的工作,入職的事件終於塵埃落定,也算是乙個新的開始吧。和守巨集聊天的時候也說了很多有關工作的事件,暢想了以後美妙的未來,也想到了以後的各種困難。不說別的就是單單在北京住房這一項就夠任何乙個職場上的人忙上好幾年的。英國天氣無常,所以...