【学习笔记】ABAP OOD设计模式 - 桥接模式
ABAP OOD設計模式 - 橋接模式
整理轉自—《SAP ABAP 面向對象程序設計(原則、模式及實踐)》
橋接模式又稱為橋梁模式,在程序開發中,采用不同的維度分解一系列對象,然后采用組合的方式,根據需要靈活組合,這個過程就是解耦和提高靈活度的過程,也就是所謂的橋接模式。
其中,
Abstraction為抽象化角色,定義出該角色的行為,同時保存一個對實現化角色的引用;
Implementor是實現化角色,它是接口或者抽象類,定義角色必需的行為和屬性;
RefinedAbstraction為修正抽象化角色,引用實現化角色對抽象化角色進行修正;ConcreteImplementor為具體實現化角色,實現接口或抽象類定義的方法或屬性。
當一個對象具有多個變化因素的時候,需要考慮依賴于抽象的實現,而不是具體的實現。
當多個變化因素在多個對象間共享時,需要考慮變化的部分抽象出來再進行聚合/合成。
將實現抽離出來,再實現抽象,使得對象的具體實現依賴于抽象,這樣符合依賴倒置原則和合成復用原則。
【示例】
比如生產訂單下達,針對不同的訂單類型,需要打印多個文檔,比如揀貨單、操作控制單等。有的類型只需要打印一個文檔,有的類型則需要打印多個文檔,如果按照訂單類型和文檔類型直接進行分類,則大致設計的結構如下圖所示。
這樣的結構充滿了冗余而且非常不易于擴展,而且文檔類型和訂單類型其實并不是繼承關系,而是包含關系,那么如何用橋接方式來進行改造呢?
創建訂單輸出文檔接口“ZIF_PROD_ORDER_OUTPUT”,并定義方法“PRINT_OUTPUT”。
創建實現接口類“ZCL_PICK_LIST”和“ZCL_OPER_CONTROL_TICKET”,實現接口方法邏輯中輸入打印控制的邏輯。
創建抽象類“ZCL_PROD_ORDER”,并定義方法“PRINT_ORDER_DOCUMENT”,設定傳入參數“II_PROD_ORDER_OUTPUT”,其類型為接口“ZIF_PROD_ORDER_OUTPUT”,不需要設定具體的實現邏輯。
創建繼承的子類“ZCL_PROD_ORDER_PP01”和“ZCL_PROD_ORDER_PP02”代表訂單類型PP01和PP02,并重新定義邏輯。
調用測試代碼,實現簡單的橋接模式。
*&---------------------------------------------------------------------*
*&?Report??ZREP_CLS_C07
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT?ZREP_CLS_C07.
DATA?:?EXC_REF?TYPE?REF?TO?CX_ROOT,
???????EXC_TEXT?TYPE?STRING,
???????LV_ORDER_TYPE1?TYPE?STRING,
???????LV_ORDER_TYPE2?TYPE?STRING,
???????LV_DOC_CLASS1?TYPE?STRING,
???????LV_DOC_CLASS2?TYPE?STRING,
???????GO_PROD_ORDER?TYPE?REF?TO?ZCL_PROD_ORDER,
???????GO_PROD_ORDER_OUTPUT?TYPE?REF?TO?ZIF_PROD_ORDER_OUTPUT.
"設定類名:必須大寫??兩個生產訂單類型?和?兩個打印單據
LV_ORDER_TYPE1?=?'ZCL_PROD_ORDER_PP01'.
LV_ORDER_TYPE2?=?'ZCL_PROD_ORDER_PP02'.
LV_DOC_CLASS1?=?'ZCL_PICK_LIST'.
LV_DOC_CLASS2?=?'ZCL_OPER_CONTROL_TICKET'.
TRY.
????"動態創建類,對生產訂單類型和打印單據進行靈活組合
????"1、生產訂單類型PP01?與兩種單據的組合
????CREATE?OBJECT?GO_PROD_ORDER?TYPE?(LV_ORDER_TYPE1).
????CREATE?OBJECT?GO_PROD_ORDER_OUTPUT?TYPE?(LV_DOC_CLASS1).
????GO_PROD_ORDER->PRINT_ORDER_DOCUMENT(?GO_PROD_ORDER_OUTPUT?).
????CREATE?OBJECT?GO_PROD_ORDER_OUTPUT?TYPE?(LV_DOC_CLASS2).
????GO_PROD_ORDER->PRINT_ORDER_DOCUMENT(?GO_PROD_ORDER_OUTPUT?).
????SKIP?2.
????"2、生產訂單類型PP02?與一種單據的組合
????CREATE?OBJECT?GO_PROD_ORDER?TYPE?(LV_ORDER_TYPE2).
????CREATE?OBJECT?GO_PROD_ORDER_OUTPUT?TYPE?(LV_DOC_CLASS1).
????GO_PROD_ORDER->PRINT_ORDER_DOCUMENT(?GO_PROD_ORDER_OUTPUT?).
??CATCH?CX_SY_CREATE_OBJECT_ERROR?INTO?EXC_REF.
????EXC_TEXT?=?EXC_REF->GET_TEXT(?).
????WRITE?:?/?EXC_TEXT.
ENDTRY.
總結
以上是生活随笔為你收集整理的【学习笔记】ABAP OOD设计模式 - 桥接模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习笔记】ABAP OOD设计模式 -
- 下一篇: 【学习笔记】区块链应用判断准则