关于spring:设计模式门面模式

49次阅读

共计 2676 个字符,预计需要花费 7 分钟才能阅读完成。

门面模式

参考资料

图解设计模式

大话设计模式

设计模式之禅

github 我见过最好的设计模式

http://c.biancheng.net/view/1…

定义

也称为外观模式

外观模式 是一种结构型设计模式,能为程序库、框架或其余简单类提供一个简略的接口。

  • 让子系统更加容易应用,属于结构型模式

例子

App 订单接口

  • 后盾提供一个聚合接口

    • 在外部别离调用了订单,物流,用户零碎
  • 可能节俭前端的申请

实用场景

  • 子系统越来越简单,减少门面模式来提供简略接口
  • 构建多层系统结构,利用门面对象作为每层的入口,简化层间调用

生存中的例子

  • 前台接待员

    • 用来做向导
  • 包工头

    • 通过包工头来找粉刷匠,找泥工等

通用写法

物流零碎案例

门面业务帮咱们聚合扣款,监测,发货的性能,客户端只须要找门面就行了

源码中的案例

Spring 的 JdbcUtils

public static boolean supportsBatchUpdates(Connection con) {
  try {DatabaseMetaData dbmd = con.getMetaData();
    if (dbmd != null) {if (dbmd.supportsBatchUpdates()) {logger.debug("JDBC driver supports batch updates");
        return true;
      }
      else {logger.debug("JDBC driver does not support batch updates");
      }
    }
  }
  catch (SQLException ex) {logger.debug("JDBC driver'supportsBatchUpdates'method threw exception", ex);
  }
  return false;
}

帮咱们包装了对连贯的操作,这样客户端只须要应用 JdbcUtils 就行了

Mybatis 的 Configuration

public MetaObject newMetaObject(Object object) {return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}

public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
  parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
  return parameterHandler;
}

public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
                                            ResultHandler resultHandler, BoundSql boundSql) {ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
  resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
  return resultSetHandler;
}

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
  statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
  return statementHandler;
}

帮咱们创立对应的对象

和其余设计模式的区别

门面模式和代理的区别

  • 门面模式就是一种非凡的动态代理
  • 门面模式,重点在于封装
  • 动态代理,重点是在加强

不做加强的动态代理就是门面模式

门面模式和单例模式的区别

常常把门面模式做成单例模式,工具包

优缺点

长处

  • 简化了调用过程,无需深刻理解子系统,避免给子系统带来危险
  • 缩小零碎依赖,涣散耦合
  • 更好的划分拜访档次,进步了安全性
  • 迪米特法令,起码晓得准则

毛病

  • 减少子系统和扩大子系统行为的时候,容易带来未知危险
  • 不合乎开闭准则
  • 某些状况下可能违反繁多职责准则

问题

门面模式

想一想什么场景下思考应用门面模式

  • 一个子系统比较复杂时,比方算法或者业务比较复杂,就能够封装出一个或多个门面进去,我的项目的构造简略,而且扩展性十分好。
  • 对于一个较大我的项目,为了防止人员带来的危险,也能够应用门面模式,技术水平比拟差的成员,尽量安顿独立的模块,而后把他写的程序封装到一个门面里,尽量让其余我的项目成员不必看到这些人的代码,看也看不懂,我也遇到过一个“高人”写的代 码,private 办法、构造函数、常量根本都不必,你要一个 public 办法,好,一个类里就一个 public 办法,所有代码都在外面,而后你就看吧,一大坨程序,看着就能把人逼疯。应用门面模式后,对门面进行单元测试,束缚我的项目成员的代码品质,对我的项目整体品质的晋升也是一个比拟好的帮忙。

我的笔记仓库地址 gitee 快来给我点个 Star 吧

正文完
 0