门面模式,其主要的应用场景,就是为了接口设计方面使用的
门面模式,为了保证接口的复用性,我们可以将接口尽量设计的细粒度一点,职责更加单一,但是接口粒度太小,在接口使用者使用的时候,会调用n多的接口才能完成,但是如果设计的接口粒度更大,一个接口返回n多数据,功能太大,那么就不符合单一职责原则,导致接口无限膨胀
那么门面模式出现了,也叫作外观模式 Facade Design Pattern,门面模式为子系统提供了统一的接口,定义一组新的接口,让子系统更加易用
那么什么时候使用呢?
系统A,提供了abcd四个接口,系统B完成某个业务功能,需要调用abd三个接口,那么利用门面模式,我们需要提供一个新的接口x,封装了包裹abd三个接口,那么为什么要提供一个包裹abd的接口x呢?
如果我们的系统A是一个后端服务器,B是一个App的客户端,客户端通过网络连接来获取到后端的数据,如果直接不进行封装,需要依次的调用abd三个接口,也就是要走三次网络通信,那么如果封装为了一个接口X,那么只需要调用网络通信一次,减少了网络通信次数,提高了App的响应速度
那么我们举一些应用场景的实例,来说明这个门面模式的使用,对于门面模式的中的子系统,可以有多种理解方式,可以是一个完整的系统,可以是更加细粒度的类或者模块
1.解决易用性问题
门面模式用来封装系统的底层实现,隐藏系统的复杂度,比如Linux系统,调用函数看作一种门面,让Linux操作系统暴露给开发者的一组特殊接口,让使用者可以调用更加友好的调用友好的命令
这样看来,门面模式和之前的迪米特法则,对于有交互的系统,只暴露有限的接口,保证了面向对象思想的抽象和封装
2.解决性能问题
就像上面说的,将多个接口替换为一个门面接口调用,减少了网络调用成本,提高了App客户端的响应速度,那么,下一个问题,如何组织门面接口呢?
如果门面接口不多,我们可以将其和非门面接口放在一起,不需要特别标记,如果很多的话,可以在原有的接口之上,在抽象出一层,专门放置门面接口
如果门面接口特别多,很多都是跨多个子系统的,可以直接放在一个新的子系统中
3.解决分布式事务问题
对于一个金融系统中,有两个或者多个业务领域的模型,比如用户模型和钱包模型,那么对两者的增删改查,会有挂在一起的情景的,比如创建用户的时候,必然会创建一个用户的钱包
那么对于这样一个简单的业务需求,就是在同一个事务中执行,创建用户和钱包的两个操作,要么都成功,要么都失败
于是我们就可以借鉴门面模式的思想,再设计一个包裹这两个操作的新接口,让这个新接口在一个事务中执行两个SQL的操作,这就是所谓门面设计模式\
本章的内容
很简单,因为类和类,模块和模块 系统和系统之间的通信,是通过调用接口来完成的,对于接口的设计,是具有非常重要性的,接口的粒度太大
导致违背了接口单一职责,太小,导致不易用
于是有了门面模式,保证接口的复用性和易用性
常用于解决接口的复用性和易用性
提高性能
解决分布式事务