计算机科学中的大多数问题都可以通过增加一层间接性来解决。  ——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实现适配器的代码:

REPORT ZNP_DP_ADAPTER.
*
INTERFACE lif_output.
METHODS: generate_output.
ENDINTERFACE. "lif_output
*
CLASS simple_op DEFINITION.
PUBLIC SECTION.
INTERFACES: lif_output.
ENDCLASS. "simple_op DEFINITION
*
CLASS simple_op IMPLEMENTATION.
METHOD lif_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.
METHOD generate_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.
METHOD lif_output~generate_output.
DATA: o_tree_op TYPE REF TO tree_output.
CREATE OBJECT o_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 TO lif_output.
CREATE OBJECT o_op TYPE simple_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 TYPE new_complex_op.
o_op->generate_output( ).

设计时的考虑

在实现适配器的时候,我们需要考虑以下内容:

  • 创建一个类,实现客户端需要的接口
  • 实例化接口兼容的对象
  • 在接口的实现方法中调用相应的方法以执行操作

如果你已经实现了这个设计模式,并且理解了它的好处,请告诉我。

原文标题:ABAP Objects Design Patterns – Adapter

本文链接:http://www.cnblogs.com/hhelibeb/p/7041300.html

ABAP设计模式——适配器的更多相关文章

  1. iOS设计模式 - 适配器

    iOS设计模式 - 适配器 效果 说明 1. 为了让客户端尽可能的通用,我们使用适配器模式来隔离客户端与外部参数的联系,只让客户端与适配器通信. 2. 本教程实现了适配器模式的类适配器与对象适配器两种 ...

  2. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  3. swift 之设计模式 适配器

    大学的时候,有一个<近世代数>的教授,他上课从来不看课本,并且也不按课本来讲解课程,但是他讲的东西比书本深刻形象(幽默,口才杠杠的),有层次感,除了授业,他还经常给我讲一些为人处世,做学问 ...

  4. 设计模式——适配器(Adapter)模式

    概述 什么是适配器?在我们生活中的适配器比如插头转换器(中标转美标).USB接口转换器(type-c转苹果),电脑电源适配器(交流电转低电压直流)等.像这种将两者有差异的东西通过适配器使他们成为相互适 ...

  5. Objective-C设计模式——适配器Adapter(接口适配)

    适配器模式 适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口.此时我们需要自己来实现适配,在适配器模式中有Target对象,即客户端所需要的接口对象,Adaptee对象,即 ...

  6. Head First设计模式——适配器和外观模式

    前言:为什么要一次讲解这两个模式,说点骚话:因为比较简单(*^_^*),其实是他们两个有相似和有时候我们容易搞混概念. 讲到这两个设计模式与另外一个“装饰者模式”也有相似,他们三个按照结构模式分类都属 ...

  7. 设计模式 适配器-Adapter

    适配器模式:将一个类的接口,转换成客户期望的另一个接口.适配器让原本接口不兼容的类可以合作无间. 直接上图.下面是对象适配器的类图.由于Java不支持多继承.所以这是Java的适配器实现方式. 结合H ...

  8. 系统架构-设计模式(适配器、观察者、代理、抽象工厂等)及架构模式(C/S、B/S、分布式、SOA、SaaS)(干货)

    博客园首页是需要分享干货的地方,今天早上写的<HRMS(人力资源管理系统)-从单机应用到SaaS应用-系统介绍>内容下架了,所以我就按照相关规定,只分享干货,我把之前写完的内容整理发布上来 ...

  9. python设计模式-适配器

    定义: 将一个接口转换为客户希望的另一个接口,该模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器模式又叫变压器模式,也叫包装模式(Wrapper),它的核心思想是将一个对象经过包装 ...

随机推荐

  1. Java并发编程笔记之基础总结(一)

    一.线程概念 说到线程就必须要提一下进程,因为线程是进程中的一个实体,线程本身是不会独立存在的.进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一 ...

  2. 由浅入深:CNN中卷积层与转置卷积层的关系

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由forrestlin发表于云+社区专栏 导语:转置卷积层(Transpose Convolution Layer)又称反卷积层或分数卷 ...

  3. Structs+Spring+Hibernate快速入门

    Structs+Spring+Hibernate,这是很经典的一个搭配,它的开发流程也比较程式化,下面以用户注册为例.     注册页面代码: <%@page contentType=" ...

  4. 猪圈密码 摩斯密码 QWE加密 栅栏加密 当铺密码

    1.猪圈密码 猪圈密码:对应下图就是HORSE 2.摩斯密码 在线摩斯密码翻译器:http://www.mathsking.net/morse.htm 3.QWE加密 键盘按ABC的顺序排列得到对应的 ...

  5. BBWebImage 设计思路

    BBWebImage 设计思路 BBWebImage 是高性能 Swift 图片组件,用于图片下载.缓存.编解码.编辑与展示. GitHub 地址: https://github.com/Silenc ...

  6. C# 元数据描述

    元数据概述:元数据是一种二进制信息,用以对存储在公共语言运行库可移植可执行文件 (PE) 文件或存储在内存中的程序进行描述.将您的代码编译为 PE 文件时,便会将元数据插入到该文件的一部分中,而将代码 ...

  7. Hive数据倾斜

    数据倾斜是进行大数据计算时最经常遇到的问题之一.当我们在执行HiveQL或者运行MapReduce作业时候,如果遇到一直卡在map100%,reduce99%一般就是遇到了数据倾斜的问题.数据倾斜其实 ...

  8. js之返回网页顶部

    目标效果:浏览网页过程中,滑动滚轮,显示返回顶部按钮,点击返回顶部后,返回网页顶端. 代码如下: <!DOCTYPE html> <html lang="en"& ...

  9. WEB前端面试选择题解答(共36题)

    第1题 ["1", "2", "3"].map(parseInt) A:["1", "2", &qu ...

  10. HTML5的DeviceOrientation实现微信摇一摇功能

    在HTML5中,DeviceOrientation特性所提供的DeviceMotion事件封装了设备的运动传感器时间,通过改时间可以获取设备的运动状态.加速度等数据(另还有deviceOrientat ...