定义: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行. 门面模式提供一个高层次的接口, 使得子系统更易于使用.
通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的唯一通道
其类图如下:
其中两个角色如下:
子系统代码如下:
门面对象代码:
门面模式的优点:
门面模式的缺点:
门面模式最大的缺点就是不符合开闭原则, 对修改关闭, 对扩展开放. 一旦在系统投产后发现有一个小错误, 怎么解决? 完全最从开闭原则,根本没办法解决. 唯一能做的一件事就是修改门面对象的代码, 这个风向相当大.
门面模式的使用场景:
1.一个子系统可以有多个门面
增加的门面非常简单, 委托给已经存在的门面对象来处理. 这样可以尽量保持相同的代码只编写一遍, 避免以后到处修改相似代码的悲剧.
2.门面不参与子系统内的业务逻辑
门面对象中不要出现具体的业务逻辑代码, 否则就会产生一个倒依赖的问题, 在门面模式中, 门面角色应该是稳定的, 它不应该经常变化, 一个系统一旦投入运行他就不应该被改变, 它是一个系统对外的接口, 变来变去还怎么保证其他模块的稳定运行呢?
如果一定要出现业务处理, 应该建立一个封装类, 封装完毕后提供给门面对象使用.
门面模式是一个很好的封装方法, 一个子系统比较复杂时, 比如算法或者业务比较复杂, 就可以封装出一个或多个门面出来, 项目的接口简单, 而且扩展性非常好. 还有, 对于一个较大的项目, 为了避免人员带来的风险, 也可以使用门面模式.