二、门面模式
门面模式(Facade)
模型图

主要思想
调用者对象想调用A对象的doXXX()时,可能需要先调用B对像的doXxx(),其实调用者只想做一件事情,但是犹豫实际业务的复杂性,它需要持有很多对象的应用,此时就可以创建一个门面对象,将这种多对象调用封装到
门面对象中,这样,调用者对象就只持有门面对象的引用,降低了耦合
代码示例
/** * 调用者类 */ class Caller { private BankFacade bankFacade; void getMoney(Integer price) { bankFacade.getMoney(price); } ; void saveMoney(Integer price) { } ; } /** * 门面类 */ class BankFacade { //经理 private C c; //柜员 private A a; //保安 private B b; void getMoney(Integer price) { //保安取号 Integer order = b.takeOrder(); //柜员取钱 a.getMoney(price, order); //经理审核通过 c.agree(price); } } /** * A 柜员 */ class A { public void getMoney(Integer price, Integer order) { //todo } ; } /** * B 保安 */ class B { //取号 Integer takeOrder() { return new Random().nextInt(); } } /** * C 经理 */ class C { //审核同意 boolean agree(Integer price) { return true; } }
实际场景
这个门面模式我们经常用,我们写WEB相关后台业务代码的时候,会给前端HTTP接口,这时候前端不关心我们后台具体逻辑,例如接口要做鉴权控制,或者需要取缓存,或者需要调其他服务,参数校验等等,前端
只是输入参数,需要返回结果而已。这是广义上的门面模式,我个人理解就是接口Api层。在有些源码项目中,可以看到有些module名称可能命名xxx_facade,里面都是一些接口定义
优缺点
- 业务内聚,调用者不需要被调用者细节

浙公网安备 33010602011771号