学习笔记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_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设计模式 - 桥接模式的主要内容,如果未能解决你的问题,请参考以下文章