ABAP设计模式之---“代理模式 (Proxy Pattern)”

1. 目的

为其他对象提供一种代理,以控制对这个对象的访问。

2. 使用场景

类比:

  • 代理模式其实是最好理解的一种模式,也是与现实世界很好对应的一种模式。现实世界中存在着各种各样的中介机构,我们可以通过合适的中介服务,提高办事效率,节省时间。
  • 比如,购房时,你可以自己去完成区域前景调研,学区调研,收集楼盘信息,然后一步步签订购房合同等等。如果你没有时间去亲力亲为整套流程,你也可以通过中介完成。
  • 只需要将你的需求提供给中介,中介会根据需求为你推荐相应的房源,当然中介会收取一定的“中介费”😉 ,在面向对象的世界里,与中介机构对应的典型设计模式也即“代理模式”。

代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。

具体到应用场景中,这些用途可以包括:

  • 远程代理:也即为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

  • 虚拟代理:根据需要创建开销很大的对象。可以通过虚拟代理来存放实例化需要很长时间的真实对象。

  • 安全代理: 用来控制真实对象的访问权限。

  • 智能索引:在调用真实对象时,代理处理一些额外的工作。

代理模式体现的设计原则有:

3. 类图

代理类,其实实现的是subject目标,但在代理对象中,我们可以附加各种“专业”的功能。
在这里插入图片描述
在这里插入图片描述

4. 代码实现

*&---------------------------------------------------------------------*
*& Report zproxy_pattern
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zproxy_pattern.

* It could be either a class or an interface
CLASS lcl_subject DEFINITION ABSTRACT.
  PUBLIC SECTION.
    METHODS request.
ENDCLASS.

CLASS lcl_subject IMPLEMENTATION.
  METHOD request.
  ENDMETHOD.
ENDCLASS.

CLASS lcl_real_subject DEFINITION FINAL CREATE PUBLIC
INHERITING FROM lcl_subject.
  PUBLIC SECTION.
    METHODS request REDEFINITION.
ENDCLASS.

CLASS lcl_real_subject IMPLEMENTATION.
  METHOD request.
    WRITE / 'This is a real request.'.
  ENDMETHOD.
ENDCLASS.

* Proxy inherits the same object, and contains the instance of real subject.
* Use proxy to access the real subject indirectly.
CLASS lcl_proxy DEFINITION FINAL CREATE PUBLIC
INHERITING FROM lcl_subject.
  PUBLIC SECTION.
    METHODS request REDEFINITION.

  PRIVATE SECTION.
    DATA mo_real_subject TYPE REF TO lcl_real_subject.
ENDCLASS.

CLASS lcl_proxy IMPLEMENTATION.
  METHOD request.
    IF mo_real_subject IS NOT BOUND.
      mo_real_subject = NEW #( ).
    ENDIF.
    WRITE / 'I am a professional proxy.'.
    WRITE / 'Running enviroment is ready...'.
    mo_real_subject->request(  ).
  ENDMETHOD.
ENDCLASS.


START-OF-SELECTION.
  DATA lo_proxy TYPE REF TO lcl_proxy.

  lo_proxy = NEW #( ).
  lo_proxy->request( ).

运行结果:
在这里插入图片描述

本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值