52 | 门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?
王争
该思维导图由 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
《设计模式之美》,新⼈⾸单¥98
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(101)
- 最新
- 精选
- 编程界的小学生我对门面模式解决分布式事务持反对意见,如果再抽离出来一个门面模式的子模块,里面肯定要包含用户/钱包数据源。然后用户系统和钱包系统有是独立的子模块,这样一个数据源岂不是散到很多地方了吗? 还有如果用户表和钱包表要拆离成两套库就GG了。 老师这里肯定是想说明门面模式的使用姿势和一些技巧,我只是没事找事一下 ...
作者回复: 你说的没错。但是,如果我用门面包装一个接口,使用分布式事务框架解决事务问题,其他多个业务就只用调用这个接口就好了,不用自己实现分布式事务问题。相当于复用了解决事务问题的代码。
2020-05-1125 - 面向百度编程解决性能问题不太理解,最终都是要调用三次接口,即使用一个门面对象封装了,但门面对象中还是需要调用三次接口,性能问题,实在想不出优在哪。性能能因为目标而转移么,想满足业务最终都是调用三次
作者回复: 前后端通信是走公网的 跟内网是有区别的
2020-04-2643 - 小兵适配器是做接口转换,解决的是原接口和目标接口不匹配的问题。 门面模式做接口整合,解决的是多接口调用带来的问题。2020-03-0217510
- Frank以前在做Activiti工作流开发时知道该工作流引擎提供了诸多门面接口供外部使用,以前只知道这样设计是对很多细节做了包装,提供友好易用的接口供用户使用。今天学习了本章内容,加深了对门面模式的理解。门面模式从定义上来看是为接口设计而提出的,所以在开发中我们在设计接口时可参考该模式。该模式对应到了之前学习过的一些设计原则和思想,如封装,迪米特法则。 对于课堂讨论: 1. 适配器模式与门面模式的区别:(a)适配器主要是为了解决接口不兼容的问题,而门面模式主要用于设计接口的易用性问题。(b)适配器在代码结构上主要是继承加组合,门面模式在代码结构上主要是封装。(c)适配器可以看作是事后行为,是一种“补偿模式”,主要是用来完善设计上的不足,而门面模式是在设计接口时就需要考虑的,是一种事前行为。 2. 在过往的开发中,自己在写接口时除了满足需求外大部分考虑是接口的幂等性,限流,安全等。对于接口的可复用性考量的不是很好,还需要大量的实践来加深。2020-03-023120
- Jackey适配器模式注重的是兼容性,而门面模式注重的是易用性2020-03-02254
- skull学设计模式让我想到了张三丰问张无忌,还记得几成,张无忌说全都忘了,好了,你已经学会了😀2020-04-30842
- 何妨建议老师可以给出一下典型的实现代码,这样会更直观一些2020-03-0333
- 黄林晴吐槽不存在的,我只知道我现在做的app刚启动的时候 要调用五六个接口...,之前没了解过门面模式,不过我在想,我去说服务端改成门面模式之前,要确定一个问题,那就是门面模式是将很多接口整合在一起,那么势必,牵扯到传参变多,以及返回数据量多的因素,这种情况下应该也比较影响效率,比如一个接口是从student表中查询,一个是从course表还有一个是从teacher表中查,门面模式和直接写一个接口sql查询这么多的效率是一样的吗2020-03-021115
- iamjohnnyzhuang之前开发SDK的时候,有个案例,我们支持两种 Config API ,一种是直接从 Resource 下或者本地文件系统读取一些静态配置,一种是从数据库读取配置(定时更新)称作动态配置。由于SDK后续是要提供给其他开发者使用,如果为此暴露两个类 StaticConfig 和 DynamicConfig 使用起来十分不便。设置了一个门面类 ConfigFcade,用组合把两个对象当做成员变量,最后通过不同的方法 getStaticConfig 和 getDynamicConfig 暴露给使用者。2020-03-20314
- progyoung解决分布式事务问题的应用场景中,如果用户和钱包并没有公用同一个数据库,那么是不是门面模式也不适用了呢?2020-03-021310
收起评论