学习笔记ABAP OOD设计模式 - 桥接模式

Posted SAP剑客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习笔记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_DOCUMENTGO_PROD_ORDER_OUTPUT ).
    CREATE OBJECT GO_PROD_ORDER_OUTPUT TYPE (LV_DOC_CLASS2).
    GO_PROD_ORDER->PRINT_ORDER_DOCUMENTGO_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_DOCUMENTGO_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设计模式 - 观察者模式

设计模式:学习笔记——桥接模式

设计模式学习笔记--桥接模式

设计模式学习笔记-桥接模式

桥接模式——HeadFirst设计模式学习笔记

设计模式学习笔记(十六:桥接模式)