查看原文
其他

这一定是你经常用,但是不知道名字的设计模式

The following article is from Java技术指北 Author 指北君

点击关注公众号,一周多次包邮送书

来源:本文经Java技术指北(ID:javanorth)授权转载,转载请联系出处作者:指北君

哈喽,大家好,我是指北君。
如题,直接上答案——门面模式!!

1、什么是门面模式?

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 直接使用。至于为什么要这样做,下文会告诉你。

2、门面模式定义

①、Facade 门面角色

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

②、Subsystem 子系统角色

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

3、门面模式通用代码实现

/**
 * 子系统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();
    }
}

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

4、门面模式优点

①、减少系统的相互依赖

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

②、提高安全性

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

5、门面模式应用场景

①、解决易用性问题

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

②、解决性能问题

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

③、解决分布式事务问题

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

6、适配器模式和门面模式区别

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

·················END·················

推荐阅读

• 助你成为 CSS 大师的18个 GitHub 仓库• 炸锅了,Java多线程批量操作,居然有人不做事务控制?• 我又发现了超赞的软硬件项目,全部开源• React如何原生实现防抖?• 竟然有一半的人不知道 for 与 foreach 的区别???• 使用MQ的时候,怎么确保消息100%不丢失?• 协程到底有什么用?6种I/O模式告诉你!

👇更多内容请点击👇


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存