1. 目的
为子系统的一组接口提供一个一致、精简的访问界面。
外观模式定义了一个高层接口,这个接口使得这一子系统(或一组相关的功能)更加容易使用。
2. 使用场景
类比:
- 外观模式也成为门面模式。其实,在现实世界中,我们能发现好多“门面”的例子。门面相当一个对外的窗口,提供了特定的服务,窗口后面隐藏了信息/组织的复杂度。你能找到合适的场景么 😃。
- 例如,你在进行理财投资时,可以单独去开户和自己选择股票,例如茅台、五粮液、格力电器等等。当公司的经营状况发生变化时,你可能需要进行相应的调整,也即调仓。如果你对于股市并不是很了解,一个“偷懒”的方式投资方式就是----买基金,可以是行业基金,可也是指数基金等等,对于基金内的股票组合,你无需操心,基金经理会帮你打理。基金经理/公司可以看成是股票市场的一种“门面”。
解析和用法:
- 外观模式是最常用的模式,当不同模块,不同系统间做集成时,facade可以清楚的划分职责,降低模块间的耦合
- 具体到使用方法,首先,在设计阶段,应当有意思地将不同的功能层分离。例如经典的三层架构模型。层与层之间建立Facade。
- 其次,在开发阶段,使用Facade来提供一个简单的接口,可以减少类之间的耦合。
- 第三,在运维阶段,可以使用Facade来隔离高复杂度的遗留代码,让新对象与Facade交互,Facade用于处理与遗留代码交互的复杂集成。
外观模式体现的设计原则:
3. 类图
client只需要与facade类定义好的接口对象交互,facade屏蔽了子系统的信息和复杂性。
在做集成开发时,有意识地使用facade模式,将有助于系统的分层和职责划分。
4. 代码实现
*&---------------------------------------------------------------------*
*& Report zfacade_pattern
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zfacade_pattern.
* we may have a couple of sub-systems / sub-components
CLASS lcl_subsystem_one DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS method_one.
ENDCLASS.
CLASS lcl_subsystem_one IMPLEMENTATION.
METHOD method_one.
WRITE / 'Method is executed in subsystem one.'.
ENDMETHOD.
ENDCLASS.
CLASS lcl_subsystem_two DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS method_two.
ENDCLASS.
CLASS lcl_subsystem_two IMPLEMENTATION.
METHOD method_two.
WRITE / 'Method is executed in subsystem two.'.
ENDMETHOD.
ENDCLASS.
CLASS lcl_subsystem_three DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS method_three.
ENDCLASS.
CLASS lcl_subsystem_three IMPLEMENTATION.
METHOD method_three.
WRITE / 'Method is executed in subsystem three.'.
ENDMETHOD.
ENDCLASS.
CLASS lcl_subsystem_four DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS method_four.
ENDCLASS.
CLASS lcl_subsystem_four IMPLEMENTATION.
METHOD method_four.
WRITE / 'Method is executed in subsystem four.'.
ENDMETHOD.
ENDCLASS.
* facade class to provides a simplified interface to client
CLASS lcl_facade DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
constructor,
method_group_a,
method_group_b.
PRIVATE SECTION.
DATA:
mo_subsys_one TYPE REF TO lcl_subsystem_one,
mo_subsys_two TYPE REF TO lcl_subsystem_two,
mo_subsys_three TYPE REF TO lcl_subsystem_three,
mo_subsys_four TYPE REF TO lcl_subsystem_four.
ENDCLASS.
CLASS lcl_facade IMPLEMENTATION.
METHOD constructor.
mo_subsys_one = NEW #( ).
mo_subsys_two = NEW #( ).
mo_subsys_three = NEW #( ).
mo_subsys_four = NEW #( ).
ENDMETHOD.
METHOD method_group_a.
WRITE / 'method group a......'.
mo_subsys_one->method_one( ).
mo_subsys_two->method_two( ).
mo_subsys_three->method_three( ).
ENDMETHOD.
METHOD method_group_b.
WRITE / 'method group b......'.
mo_subsys_two->method_two( ).
mo_subsys_three->method_three( ).
mo_subsys_four->method_four( ).
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
* Client only needs interacts with facade
DATA lo_facade TYPE REF TO lcl_facade.
lo_facade = NEW #( ).
lo_facade->method_group_a( ).
lo_facade->method_group_b( ).
运行结果:
本博客专注于技术分享,干货满满,持续更新。
欢迎关注❤️、点赞👍、转发📣!