目录
外观模式介绍
外观模式又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口
- 适用场景:子系统越来越复杂,增加外观模式提供简单调用接口;构建多层系统结构,利用外观对象作为每层入口,简化层间调用。
- 优点:简化了调用过程,无需深入了解子系统,防止带来风险;减少系统依赖,松散耦合;更好的划分层次;符合迪米特法制,即最少知道原则。
- 缺点:增加子系统、扩展子系统容易引入风险;不符合开闭原则(对扩展开放,对修改关闭)
外观模式在spring jdbc模块中的应用
位于org.springframework.jdbc.support包中的JdbcUtils类,它是主要供内部使用的JDBC的通用方法。
JdbcUtils类中的closeConnection、closeStatement、closeResultSet、extractDatabaseMetaData等方法就是外观类提供的调用子类的接口。
public static void closeConnection(@Nullable Connection con) {
if (con != null) {
try {
con.close();
}
catch (SQLException ex) {
logger.debug("Could not close JDBC Connection", ex);
}
catch (Throwable ex) {
// We don't trust the JDBC driver: It might throw RuntimeException or Error.
logger.debug("Unexpected exception on closing JDBC Connection", ex);
}
}
}
由于几个方法的调用关系相同,所以只看方法即可。closeConnection方法的入参Connection类位于java.sql包下,通过外观类的包装,客户端直接调外观类进行相应操作接口不需要直接调java.sql包下的子类。
JdbcUtils处的外观模式有一个特别的地方,就是客户端在调用方法时需要传入子类的对象,这样就导致客户端和子类建立了直接的联系。初看似乎不太符合解耦合的思想。我理解这么处理的原因是java.sql包作为数据导入的基础包,充斥在上层结构中,早建立了很多关联,所以就不再需要做多余的解耦合处理。
外观模式在tomcat中的应用
先下载tomcat的源码
导入编译器,找到org.apache.catalina.connector包下的RequestFacade类,它实现了
HttpServletRequest接口,RequestFacade是一个外观类。找到同包中的Request类,可以看到此处request是一个客户端通过RequestFacade外观类调用了HttpServletRequest类的方法。
tomcat中山使用了大量的外观模式,可以搜索facade关键字结尾的类进行研究学习外观模式。