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 shipStockSys verify fail
StockSys verify success
PaySys pay fail
到此这篇关于Java设计模式中的门面模式详解的文章就介绍到这了,更多相关Java门面模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java concurrency之AtomicLongArray原子类_动力节点Java学院整理
这篇文章主要介绍了Java concurrency之AtomicLongArray原子类的相关知识,感兴趣的朋友参考下吧2017-06-06SpringBoot2.0整合Redis自定义注入bean组件配置的实战教程
这篇文章主要介绍了SpringBoot2.0整合Redis自定义注入bean组件配置,我们将基于SpringBoot2.0整合搭建的微服务项目为奠基,开启中间件Redis的实战之路,需要的朋友可以参考下2023-06-06IntelliJ IDEA2021.1 配置大全(超详细教程)
这篇文章主要介绍了IntelliJ IDEA2021.1 配置大全(超详细教程),需要的朋友可以参考下2021-04-04SpringDataJpa:JpaRepository增删改查操作
这篇文章主要介绍了SpringDataJpa:JpaRepository增删改查操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08Spring Security CsrfFilter过滤器用法实例
这篇文章主要介绍了Spring Security CsrfFilter过滤器用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-11-11
最新评论