ABAP设计模式——适配器
计算机科学中的大多数问题都可以通过增加一层间接性来解决。 ——David Wheeler
适配器模式(Adapter Design Pattern),是一个广泛应用于真实世界和面向对象编程语言的设计模式。基于面向对象的标准SAP程序中同样很多地使用了适配器模式。
适配器是什么?
适配器把因为不同的“接口”而不兼容的对象转换(为兼容的)。通过实现适配器,我们可以让一些原本不能共同工作的类共同工作。
有时,我们有一个客户端,它希望对象只有一个确定的接口。还有一个对象,他能满足功能上的要求,但是两个对象的接口是不同的。因此,我们不能直接通过相同的接口调用现存的对象。所以,我们需要创建一种“包装”来把对象的接口转换为可以被另一个客户端或者对象所接受的接口。
听起来有点耳熟?是的,我们在很多情况下使用这种包装——无论是真实世界还是编程。在真实世界,我们使用通过USB接口工作的Mini SD卡读取器,从而读取数据。在ABAP里面,标准的SAP程序中的大部分BAPI FM会用到它。
适配器的UML
下图是本文的适配器示例的UML图:
有个简单的输出类来实现LIF_OUTPUT。客户端使用接口LIF_OUTPUT来和输出类交互。让我们看看适配器是如何实现的:
- LIF_OUTPUT——客户端只接受使和实现了该接口的对象一起工作。因此,所有的需要和客户端交互的对象必须实现该接口。该组件叫做“Target”.
- TREE_OUTPUT——这是一个没有实现相应接口的对象。但是该对象满足了我们对于生成树的所有需求。该组件叫做“Adaptee”.
- NEW_COMPLEX_OP——这是一个新的对象,扮演实现了LIF_OUTPUT的TREE_OUTPUT的包装者的角色。所以,客户端可以通过同样的接口无缝生成复杂输出(TREE).它叫做“Adapter”.
SALV模型使用了适配器模式来通过SALV的兼容接口来将属性映射到Classical ALV或者ALV Grid的属性上。
代码
使用OO ABAP实现适配器的代码:
REPORTZNP_DP_ADAPTER.*INTERFACElif_output.METHODS: generate_output.ENDINTERFACE. "lif_output*CLASS simple_op DEFINITION.PUBLIC SECTION.INTERFACES: lif_output.ENDCLASS. "simple_op DEFINITION*CLASS simple_op IMPLEMENTATION.METHODlif_output~generate_output.WRITE: / 'Simple Output - just using WRITE'.ENDMETHOD. "lif_output~generate_output ENDCLASS. "simple_op IMPLEMENTATION*CLASS tree_output DEFINITION.PUBLIC SECTION.METHODS: generate_tree.ENDCLASS. "tree_output DEFINITION*CLASS tree_output IMPLEMENTATION.METHODgenerate_tree.WRITE: / 'Creating Tree ... using CL_GUI_ALV_TREE'.ENDMETHOD. "generate_tree ENDCLASS. "tree_output IMPLEMENTATION*CLASS new_complex_op DEFINITION.PUBLIC SECTION.INTERFACES: lif_output.ENDCLASS. "new_complex_op DEFINITION*CLASS new_complex_op IMPLEMENTATION.METHODlif_output~generate_output.DATA: o_tree_op TYPE REF TOtree_output.CREATE OBJECTo_tree_op.
o_tree_op->generate_tree( ).ENDMETHOD. "lif_output~generate_output ENDCLASS. "new_complex_op IMPLEMENTATION*START-OF-SELECTION.DATA: o_op TYPE REF TOlif_output.CREATE OBJECT o_op TYPEsimple_op.
o_op->generate_output( ).*using the same "simple" Interface to perform the "complex",*Since Client only wants to use Simple interface .. CREATE OBJECT o_op TYPEnew_complex_op.
o_op->generate_output( ).
- 上一篇: SAP PI入门
- 下一篇: ABAP 7.40, SP08 中的 Open SQL 新特性