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( ).
运行结果:
本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!