门面模式
参考资料
图解设计模式
大话设计模式
设计模式之禅
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 吧