Java设计模式中的门面模式详解

 更新时间:2022年09月22日 14:47:52   作者:丨Jack_Chen丨  
门面模式又叫外观模式(Facade Pattern),主要用于隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口,本文通过实例代码给大家介绍下java门面模式的相关知识,感兴趣的朋友一起看看吧

门面模式

概述

门面模式(Facade Pattern)又叫外观模式,属于结构性模式。

它提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。

客户端不需要知道系统内部的复杂联系,只需定义系统的入口。即在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

应用场景

为复杂的模块或子系统提供外界访问的模块。

子系统相对独立。 

预防额外操作带来的风险。

目的

降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。

优缺点

优点:

减少系统相互依赖。 

提高灵活性。 

提高安全性。

缺点:

不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。也就是说系统可以提供新的功能模块而不必进行修改。

主要角色

门面模式主要包含2种角色:

1.外观角色(Facade):

外观角色也称门面角色,系统对外的统一接口;

2.子系统角色(SubSystem):

可以同时有一个或多个SubSystem。每个SubSytem都不是一个单独的类,而是一个类的集合。

SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)

门面模式的基本使用

创建子系统角色

创建2个创建子系统角色:SubSystemA 与SubSystemB

public class SubSystemA {
    public void subSystem() {
        System.out.println("subSystem A");
    }
}
public class SubSystemB {
    public void subSystem() {
        System.out.println("subSystem B");
    }
}

创建外观角色

public class Facade {
    private SubSystemA a = new SubSystemA();
    private SubSystemB b = new SubSystemB();
    /**
     * 提供对外接口
     */
    public void subSystemA() {
        this.a.subSystem();
    }
    /**
     * 提供对外接口
     */
    public void subSystemB() {
        this.b.subSystem();
    }
}

客户端调用

    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.subSystemA();
        facade.subSystemB();
    }

门面模式实现商城下单

如商城系统中的下单,下单过程可能涉及多个模块子系统的联动操作,如果分别发送网络请求各个模块子系统的接口,会增加一定复杂度与额外的网络请求。

此时可以采取门面模式,将所有相关接口整合到一个接口中,由后端提供一个接口给前端调用。

假设在一个商城系统中,涉及库存系统、支付系统、物流系统、入口系统。用户下单时进行校验库存,验证支付,最后发货这一整个过程串联起来,提供一个统一接口供客户端调用。

库存系统

public class StockSys {
    /**
     * 库存校验
     */
    public Boolean verify(){
        if (Math.random()*10 >5) {
            System.out.println("StockSys verify success");
            return true;
        }
        System.out.println("StockSys verify fail");
        return  false;
    }
}

支付系统

public class PaySys {
    /**
     * 支付
     */
    public Boolean pay() {
        if (Math.random()*10 >2) {
            System.out.println("PaySys pay success");
            return true;
        }
        System.out.println("PaySys pay fail");
        return  false;
    }
}

物流系统

public class LogisticsSys {
    /**
     * 发货
     */
    public void ship() {
        System.out.println("logistics ship");
    }
}

入口系统

public class MySys {
    StockSys stockSys = new StockSys();
    PaySys paySys = new PaySys();
    LogisticsSys logisticsSys = new LogisticsSys();
    public void order() {
        if (stockSys.verify()) {
            if (paySys.pay()) {
                logisticsSys.ship();
            }
        }
    }
}

客户端调用

    public static void main(String[] args) {
        new MySys().order();
    }

StockSys verify success
PaySys pay success
logistics ship

StockSys verify fail

StockSys verify success
PaySys pay fail

到此这篇关于Java设计模式中的门面模式详解的文章就介绍到这了,更多相关Java门面模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot动态切换数据源的具体实现与原理分析

    Springboot动态切换数据源的具体实现与原理分析

    目前有个需求,需要使用不同的数据源,例如某业务要用A数据源,另一个业务要用B数据源,所以下面这篇文章主要给大家介绍了关于Springboot动态切换数据源的具体实现与原理分析,需要的朋友可以参考下
    2021-12-12
  • Feign如何解决服务之间调用传递token

    Feign如何解决服务之间调用传递token

    这篇文章主要介绍了Feign如何解决服务之间调用传递token,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java多线程状态及方法实例解析

    Java多线程状态及方法实例解析

    这篇文章主要介绍了Java多线程状态及方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • spring boot 监控处理方案实例详解

    spring boot 监控处理方案实例详解

    这篇文章主要介绍了spring boot 监控处理方案的相关资料,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Java之Algorithm_analysis案例详解

    Java之Algorithm_analysis案例详解

    这篇文章主要介绍了Java之Algorithm_analysis案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • Java实现颜色渐变效果

    Java实现颜色渐变效果

    这篇文章主要为大家详细介绍了Java实现颜色渐变效果的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • SpringBoot使用Swagger范例讲解

    SpringBoot使用Swagger范例讲解

    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 Restful 风格的 Web 服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码,允许API来始终保持同步
    2022-07-07
  • Spring Security OAuth2集成短信验证码登录以及第三方登录

    Spring Security OAuth2集成短信验证码登录以及第三方登录

    这篇文章主要介绍了Spring Security OAuth2集成短信验证码登录以及第三方登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Spring Boot中是如何处理日期时间格式的

    Spring Boot中是如何处理日期时间格式的

    这篇文章主要介绍了Spring Boot中是如何处理日期时间格式的,帮助大家更好的理解和学习spring boot框架,感兴趣的朋友可以了解下
    2020-11-11
  • java异常机制分析

    java异常机制分析

    这篇文章主要介绍了java异常机制,包括异常机制的捕获、抛出及常见的异常机制总结,需要的朋友可以参考下
    2014-09-09

最新评论