门面模式(Facade Pattern)又叫作外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型设计模式

    用一个高层接口把对各个子系统的调用封装成高级接口的一次调用,理想情况除了高级接口不允许有其他接口可以调用子系统。
    image.png

    优点:

    • 解耦,封装性好
    • 减少子系统间的相互依赖,client只依赖于facade不关心具体的子系统,子系统之间不需要关心其余子系统的逻辑

    缺点

    • 不符合开闭原则
    • 扩展子系统时带来风险

    场景

    • 分布式系统RPC接口
    • 把一个复杂的业务模块抽象出来
    • 提高子系统之间的独立性

    框架
    Mybatis的Configuration类

    1. public MetaObject newMetaObject(Object object) {
    2. return MetaObject.forObject(object, this.objectFactory, this.objectWrapperFactory, this.reflectorFactory);
    3. }
    4. public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
    5. ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
    6. parameterHandler = (ParameterHandler)this.interceptorChain.pluginAll(parameterHandler);
    7. return parameterHandler;
    8. }
    9. public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler, ResultHandler resultHandler, BoundSql boundSql) {
    10. ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
    11. ResultSetHandler resultSetHandler = (ResultSetHandler)this.interceptorChain.pluginAll(resultSetHandler);
    12. return resultSetHandler;
    13. }
    14. public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
    15. StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
    16. StatementHandler statementHandler = (StatementHandler)this.interceptorChain.pluginAll(statementHandler);
    17. return statementHandler;
    18. }

    Tomcat的RequestFacade封装了很多request的方法