意外发现,原来你不知道自己每天都在用门面模式
本文节选自《设计模式就该这样学》
1 使用门面模式整合已知 API 的功能
一般的电商平台都是整合众多的子系统聚合到一起形成一个大型的购物平台,一般情况下,有很多现成的功能都不是重新开发的,而是要去对接已有的各个子系统,这些子系统可能涉及积分系统、支付系统、物流系统的接口调用。如果所有的接口调用全部由前端发送网络请求去调用现有接口,一则会增加前端开发人员的难度,二则会增加一些网络请求,影响页面性能。此时就可以发挥门面模式的优势了。将所有现成的接口全部整合到一个类中,由后端提供统一的接口供前端调用,这样前端开发人员就不需要关心各接口的业务关系,只需要把精力集中在页面交互上。我们用代码来模拟一个积分兑换礼品的业务场景。首先创建礼品的实体类 GiftInfo。
然后编写各个子系统的业务逻辑代码,创建积分系统 QualifyService 类。
创建支付系统 PaymentService 类。
创建物流系统 ShippingService 类。
接着创建外观角色 GiftFacadeService 类,对外只开放一个兑换礼物的 exchange()方法,在 exchange()方法内部整合 3 个子系统的所有功能。
最后来看客户端代码。
运行结果如下图所示。
通过这样一个案例对比,相信大家对门面模式的印象就非常深刻了。
2 门面模式在 Spring 源码中的应用
先来看 Spring JDBC 模块下的 JdbcUtils 类,它封装了与 JDBC 相关的所有操作,代码片段如下。
更多其他操作,看它的结构就非常清楚了,如下图所示。
3 门面模式在 MyBatis 源码中的应用
再来看一个 MyBatis 中的 Configuration 类,其中有很多 new 开头的方法,源码如下。
上面这些方法都是对 JDBC 中关键组件操作的封装。
4 门面模式在 Tomcat 源码中的应用
另外,门面模式在 Tomcat 的源码中也有体现,也非常有意思。以 RequestFacade 类为例,来看其源码。
从名字就知道它用了门面模式。它封装了非常多的 request 操作,也整合了很多 servlet-api 以外的内容,给用户使用提供了很大便捷。同样,Tomcat 针对 Response 和 Session 也封装了对应的 ResponseFacade 类和 StandardSessionFacade 类,感兴趣的小伙伴可以深入了解一下。
小伙伴们是不是意外地发现,你每天都在用门面模式?
关注微信公众号『 Tom 弹架构 』回复“设计模式”可获取完整源码。
本文为“Tom 弹架构”原创,转载请注明出处。技术在于分享,我分享我快乐!
如果本文对您有帮助,欢迎关注和点赞;如果您有任何建议也可留言评论或私信,您的支持是我坚持创作的动力。关注微信公众号『 Tom 弹架构 』可获取更多技术干货!
版权声明: 本文为 InfoQ 作者【Tom弹架构】的原创文章。
原文链接:【http://xie.infoq.cn/article/02a851185bf081912612fcff9】。文章转载请联系作者。
评论