• (10)外观模式


    一、概念

            为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。

     适用性

    1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给这些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。

    2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

    3、当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。

    如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

    二、举例子

    客户下单付款后,有一系列的动作:采摘/商品包装/物流送货

    PS:订单流程,需要关注三个组件服务的使用细节。有使用风险

    • 使用外观模式

    ---------糅合功能,对外只提供一个入口。

    PS:

    1、调用方只关注facade组件,不需要知道底层服务。

    2、隐藏掉底层服务中,不相干的功能。

    场景:当访问流程较复杂时,将流程封闭成一个接口,供外部使用

    三、代码示例

    采摘服务

    1. /**
    2. * 采摘服务
    3. */
    4. public class PickService {
    5. /**
    6. * 采摘水果
    7. */
    8. public void doPick(){
    9. System.out.println("开始采摘");
    10. System.out.println(". . .");
    11. System.out.println("采摘完成");
    12. }
    13. public void doOther(){
    14. System.out.println("其它服务");
    15. }
    16. }

    打包服务

    1. /**
    2. * 包装服务
    3. */
    4. public class PackService {
    5. public void doPack(){
    6. System.out.println("开始打包");
    7. System.out.println(". . .");
    8. System.out.println("打包完成");
    9. }
    10. public void doOther(){
    11. System.out.println("其它服务");
    12. }
    13. }

    配送服务

    1. /**
    2. * 快递服务
    3. */
    4. public class SendService {
    5. /**
    6. * 指定目的地,发送快递
    7. */
    8. public void doSend(){
    9. System.out.println("开始配送");
    10. //以下物流运输业务。。。。
    11. System.out.println("本次快递目的地:北京-朝阳区-三里屯");
    12. }
    13. public void doOther(){
    14. System.out.println("其它服务");
    15. }
    16. }

    门面类

    1. /**
    2. * 订单 Facade
    3. */
    4. public class OrderFacade {
    5. // 采摘服务
    6. private PickService pickService;
    7. // 包装服务
    8. private PackService packService;
    9. // 配送服务
    10. private SendService sendService;
    11. /**
    12. * 构造方法
    13. * 注入采摘,打包,配送服务
    14. */
    15. public OrderFacade(){
    16. pickService = new PickService();
    17. packService = new PackService();
    18. sendService = new SendService();
    19. }
    20. /**
    21. * 客户订单一键处理类
    22. */
    23. public void doOrder(){
    24. //采摘
    25. System.out.println("--------------");
    26. pickService.doPick();
    27. //包装
    28. System.out.println("--------------");
    29. packService.doPack();
    30. //快递
    31. System.out.println("--------------");
    32. sendService.doSend();
    33. }
    34. }

    客户端

    1. /**
    2. * 客户服务
    3. */
    4. public class CustomerClient {
    5. public static void main(String[] args) {
    6. doOrderFacade();
    7. }
    8. /**
    9. * 下订单方式一,三步走
    10. */
    11. public static void doOrder() {
    12. PickService pickService = new PickService();
    13. PackService packService = new PackService();
    14. SendService sendService = new SendService();
    15. //采摘
    16. System.out.println("--------------");
    17. pickService.doPick();
    18. //包装
    19. System.out.println("--------------");
    20. packService.doPack();
    21. //快递
    22. System.out.println("--------------");
    23. sendService.doSend();
    24. }
    25. /**
    26. * 下订单方式二,一键完成
    27. */
    28. public static void doOrderFacade() {
    29. OrderFacade orderFacade = new OrderFacade();
    30. orderFacade.doOrder();
    31. }
    32. }

  • 相关阅读:
    wo-gradient-card是一款采用uniapp实现的透明辉光动画卡片
    Python百日进阶-WEB开发】Day151 - 前端基础 之 Javascript
    CSS基础
    【观点】区块链的未来:分布式商业;企业的未来:分布式商业生态战略
    阿里15年技术老兵用140个案例整合出Java微服务架构实战
    您可知道如何通过`HTTP2`实现TCP的内网穿透???
    Transformer - 基础分析与实现
    Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选
    对于get请求如何加swagger接口文档的字段注释
    TypeScript学习二(变量声明)
  • 原文地址:https://blog.csdn.net/qq_17021569/article/details/125596789