Java设计模式之(九)——门面模式

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.

门面模式(Facade Pattern):也叫外观模式,要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。 门面模式提供一个高层次的接口,使得子系统更易于使用。

说人话:假设有一个系统 A,提供了 a、b、c、d 四个接口。系统 B 完成某个业务功能,需要调用 A 系统的 a、b、d 接口。利用门面模式,我们提供一个包裹 a、b、d 接口调用的门面接口 x,给系统 B 直接使用。至于为什么要这样做,下文会告诉你。

①、Facade 门面角色

此角色知晓子系统的所有功能和责任,客户端可以调用这个角色的方法,会将所有从客户端发来的请求委派到相应的子系统去, 也就说该角色没有实际的业务逻辑, 只是一个委托类。

②、Subsystem 子系统角色

可以同时有一个或者多个子系统。 每一个子系统都不是一个单独的类, 而是一个类的集合。 子系统并不知道门面的存在。 对于子系统而言, 门面仅仅是另外一个客户端而已。

/**
 * 子系统A
 */
public class ClassA {
    public void doA(){
        System.out.println("子系统A方法");
    }
}
/**
 * 子系统B
 */
public class ClassB {
    public void doB(){
        System.out.println("子系统B方法");
    }
}
/**
 * 子系统C
 */
public class ClassC {
    public void doC(){
        System.out.println("子系统C方法");
    }
}
/**
 * 门面角色
 */
public class Facade {
    private ClassA a = new ClassA();
    private ClassB b = new ClassB();
    private ClassC c= new ClassC();

    // 提供给外部访问的方法
    public void doSomething(){
        this.a.doA();
        this.b.doB();
        this.c.doC();
    }
}

看上去,没有门面角色,我们自己去调用三个子系统的方法也是一样,但是假如三个子系统之间有先后顺序,还有来自不同网络开销,我们通过门面模式提供的方法,就屏蔽了这些差异,让我们只需要调用门面角色提供给我们的方法即可。

①、减少系统的相互依赖

如果我们不使用门面模式, 外界访问直接深入到子系统内部, 相互之间是一种强耦合关系, 你死我就死, 你活我才能活, 这样的强依赖是系统设计所不能接受的, 门面模式的出现就很好地解决了该问题, 所有的依赖都是对门面对象的依赖, 与子系统无关。

②、提高安全性

想让你访问子系统的哪些业务就开通哪些逻辑, 不在门面上开通的方法, 你休想访问到。

①、解决易用性问题

门面模式可以用来封装系统的底层实现,隐藏系统的复杂性,提供一组更加简单易用、更高层的接口。

②、解决性能问题

通过将多个接口调用替换为一个门面接口调用,减少网络通信成本,提高客户端的响应速度。

③、解决分布式事务问题

需要调用多个子系统的接口方法,而这些接口要么都成功,要么都失败,我们就可以利用门面模式包裹这些子系统接口,然后通过某种方法保证这些接口在一个事务中完成。

适配器模式:主要做接口转换,解决的是原接口和目标接口不匹配的问题。
门面模式:主要做接口整合,解决的是多接口调用带来的问题。

Original: https://www.cnblogs.com/ysocean/p/15605521.html
Author: YSOcean
Title: Java设计模式之(九)——门面模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538379/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • github打不开怎么办

    打开以下三个网址,分别取各个网址如下图所示位置的IP地址 github网址查询: github域名查询: 修改hosts文件,路径为c:\windows\system32\driv…

    Java 2023年6月5日
    075
  • JVM内存区域与内存溢出异常(1)

    运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据 区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的 启动…

    Java 2023年6月13日
    066
  • Vue脚手架配置代理

    方法一:在vue.config.js中添加如下配置 devServer: { proxy: "远程服务器地址及端口号", } 说明: 优点:配置简单,请求资源时…

    Java 2023年6月13日
    072
  • C#winform单线程事例与多线程事例

    通过例子编写,用winform编写的,讲解单线程与多线程使用,用于异步加载数据,界面不会卡死,数据在后台默认加载,给用户更好的体验。稍后会附加完整代码。 1、先不用线程,显示一个求…

    Java 2023年5月29日
    092
  • 设计模式之行为型模式-访问者模式

    访问者模式(Visitor Pattern) 一、 介绍 模式定义:封装一些作用于某种数据结构中的各元素的操作,它可以在 不改变数据结构的前提下定义作用于这些元素的 新的操作。 意…

    Java 2023年6月7日
    082
  • JavaScript&Bootstrap

    JS介绍 JS诞生主要是完成页面的数据验证。因此它运行在客户端,需要浏览器来执行JS代码 JS最早取名LiveScript;为了吸引更多的Java程序员,更名JavaScript …

    Java 2023年6月6日
    068
  • Docker操作(三) 自定义镜像

    Docker操作(三)自定义镜像 自定义镜像是Docker解决配置环境问题的一个方案: Docker将整个项目连同相关的运行环境一并打包,制作成一个镜像。 当需要快速部署项目的时候…

    Java 2023年6月8日
    062
  • Java实现pdf转html

    引入pdf2dom net.sf.cssbox pdf2dom 1.8 测试代码: import java.io.File; import java.io.FileInputStr…

    Java 2023年5月29日
    069
  • Java中的包装类(Interage和String)

    包装类的分类 包装类的特点 包装类有了类的属性就可以调用类中的方法,更有了类的特点,还可以进行类型的互相转换,更方便我们使用。 包装类和基本数据类型的转换 jdk5前的手动装箱和拆…

    Java 2023年6月6日
    068
  • 解决.net mvc session超时的问题

    在.NET MVC中session的默认有效期是20分钟 调整的方式是在项目的Web.config中进行配置,如下方式可以调整为120分钟。 <system.web> …

    Java 2023年5月29日
    055
  • Java学习-086-Springboot 自定义启动 banner 信息

    Springboot 启动时会加载默认的 banner 信息,并在控制台输出。因而可以通过自定义 banner 文件内容实现启动 banner 的自定义。 在项目的 resouce…

    Java 2023年5月29日
    078
  • JAVA入门基础_从零开始的培训_JAVA IO流、多线程、集合(四)

    IO流 什么是IO流、能够做什么、分类 IO的基本使用 节点流的基本使用FileInputStream、FileOutputStream、FileReader、FileWriter…

    Java 2023年6月9日
    0148
  • git 重写历史

    link:date: 2022-08-30 历史提交commit信息修改 修改最新log $ git commit –amend 修改多个提交信息 Git 没有一个改变历史工具,…

    Java 2023年6月13日
    071
  • spring拦截器中使用spring的自动注入

    需要在spring的拦截器中使用自定义的服务,这要就设计到将服务注入到拦截器中。网上看的情况有两种: 1、 1 @Configuration 2 public class OptP…

    Java 2023年5月30日
    079
  • 微服务与领域驱动设计,架构实践总结

    怎样的架构才能配得上造到飞起的变化? 一、软件复杂性 1、复杂原因 如果软件系统存在持续的迭代周期,那么其中业务、技术、架构的复杂性都会直线拉升,其相应的开发难度也会提高,可以用一…

    Java 2023年6月15日
    071
  • Spring学习笔记2

    六、自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 1、在xml中显示的…

    Java 2023年6月7日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球