设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

52 | 门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?

利用数据库事务或Spring框架提供的事务
减少网络通信成本
隐藏系统复杂性
封装系统底层实现
允许提供冗余的门面接口
保持接口的可复用性
解决分布式事务问题
解决性能问题
解决易用性问题
高层接口让子系统更易用
提供统一的接口
项目开发中的接口需求和难用接口
适配器模式和门面模式的区别
处理原则
接口粒度的影响
接口设计的重要性
门面模式的应用场景举例
门面模式的原理与实现
课堂讨论
重点回顾
门面模式
适配器模式
装饰器模式
桥接模式
代理模式
如何设计合理的接口粒度以兼顾接口的易用性和通用性?

该思维导图由 AI 生成,仅供参考

前面我们已经学习了代理模式、桥接模式、装饰器模式、适配器模式,这 4 种结构型设计模式。今天,我们再来学习一种新的结构型模式:门面模式。门面模式原理和实现都特别简单,应用场景也比较明确,主要在接口设计方面使用。
如果你平时的工作涉及接口开发,不知道你有没有遇到关于接口粒度的问题呢?
为了保证接口的可复用性(或者叫通用性),我们需要将接口尽量设计得细粒度一点,职责单一一点。但是,如果接口的粒度过小,在接口的使用者开发一个业务功能时,就会导致需要调用 n 多细粒度的接口才能完成。调用者肯定会抱怨接口不好用。
相反,如果接口粒度设计得太大,一个接口返回 n 多数据,要做 n 多事情,就会导致接口不够通用、可复用性不好。接口不可复用,那针对不同的调用者的业务需求,我们就需要开发不同的接口来满足,这就会导致系统的接口无限膨胀。
那如何来解决接口的可复用性(通用性)和易用性之间的矛盾呢?通过今天对于门面模式的学习,我想你心中会有答案。话不多说,让我们正式开始今天的学习吧!

门面模式的原理与实现

门面模式,也叫外观模式,英文全称是 Facade Design Pattern。在 GoF 的《设计模式》一书中,门面模式是这样定义的:
Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

门面模式是一种重要的设计模式,旨在提供统一的接口,简化子系统的使用。通过封装系统底层实现,该模式能够隐藏复杂性,提供更易用的接口,解决易用性和性能问题。此外,门面模式还可用于设计新接口,实现多个操作在一个事务中执行,解决分布式事务问题。文章强调了接口设计的重要性,指出接口粒度设计需权衡可复用性和易用性,允许提供冗余的门面接口来提供更易用的接口。总的来说,门面模式在接口设计和系统优化中具有重要作用,能够帮助开发者解决多方面的技术挑战。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(101)

  • 最新
  • 精选
  • 编程界的小学生
    我对门面模式解决分布式事务持反对意见,如果再抽离出来一个门面模式的子模块,里面肯定要包含用户/钱包数据源。然后用户系统和钱包系统有是独立的子模块,这样一个数据源岂不是散到很多地方了吗? 还有如果用户表和钱包表要拆离成两套库就GG了。 老师这里肯定是想说明门面模式的使用姿势和一些技巧,我只是没事找事一下 ...

    作者回复: 你说的没错。但是,如果我用门面包装一个接口,使用分布式事务框架解决事务问题,其他多个业务就只用调用这个接口就好了,不用自己实现分布式事务问题。相当于复用了解决事务问题的代码。

    2020-05-11
    2
    5
  • 面向百度编程
    解决性能问题不太理解,最终都是要调用三次接口,即使用一个门面对象封装了,但门面对象中还是需要调用三次接口,性能问题,实在想不出优在哪。性能能因为目标而转移么,想满足业务最终都是调用三次

    作者回复: 前后端通信是走公网的 跟内网是有区别的

    2020-04-26
    4
    3
  • 小兵
    适配器是做接口转换,解决的是原接口和目标接口不匹配的问题。 门面模式做接口整合,解决的是多接口调用带来的问题。
    2020-03-02
    17
    510
  • Frank
    以前在做Activiti工作流开发时知道该工作流引擎提供了诸多门面接口供外部使用,以前只知道这样设计是对很多细节做了包装,提供友好易用的接口供用户使用。今天学习了本章内容,加深了对门面模式的理解。门面模式从定义上来看是为接口设计而提出的,所以在开发中我们在设计接口时可参考该模式。该模式对应到了之前学习过的一些设计原则和思想,如封装,迪米特法则。 对于课堂讨论: 1. 适配器模式与门面模式的区别:(a)适配器主要是为了解决接口不兼容的问题,而门面模式主要用于设计接口的易用性问题。(b)适配器在代码结构上主要是继承加组合,门面模式在代码结构上主要是封装。(c)适配器可以看作是事后行为,是一种“补偿模式”,主要是用来完善设计上的不足,而门面模式是在设计接口时就需要考虑的,是一种事前行为。 2. 在过往的开发中,自己在写接口时除了满足需求外大部分考虑是接口的幂等性,限流,安全等。对于接口的可复用性考量的不是很好,还需要大量的实践来加深。
    2020-03-02
    3
    120
  • Jackey
    适配器模式注重的是兼容性,而门面模式注重的是易用性
    2020-03-02
    2
    54
  • skull
    学设计模式让我想到了张三丰问张无忌,还记得几成,张无忌说全都忘了,好了,你已经学会了😀
    2020-04-30
    8
    42
  • 何妨
    建议老师可以给出一下典型的实现代码,这样会更直观一些
    2020-03-03
    33
  • 黄林晴
    吐槽不存在的,我只知道我现在做的app刚启动的时候 要调用五六个接口...,之前没了解过门面模式,不过我在想,我去说服务端改成门面模式之前,要确定一个问题,那就是门面模式是将很多接口整合在一起,那么势必,牵扯到传参变多,以及返回数据量多的因素,这种情况下应该也比较影响效率,比如一个接口是从student表中查询,一个是从course表还有一个是从teacher表中查,门面模式和直接写一个接口sql查询这么多的效率是一样的吗
    2020-03-02
    11
    15
  • iamjohnnyzhuang
    之前开发SDK的时候,有个案例,我们支持两种 Config API ,一种是直接从 Resource 下或者本地文件系统读取一些静态配置,一种是从数据库读取配置(定时更新)称作动态配置。由于SDK后续是要提供给其他开发者使用,如果为此暴露两个类 StaticConfig 和 DynamicConfig 使用起来十分不便。设置了一个门面类 ConfigFcade,用组合把两个对象当做成员变量,最后通过不同的方法 getStaticConfig 和 getDynamicConfig 暴露给使用者。
    2020-03-20
    3
    14
  • progyoung
    解决分布式事务问题的应用场景中,如果用户和钱包并没有公用同一个数据库,那么是不是门面模式也不适用了呢?
    2020-03-02
    13
    10
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部