Facade的定义 为子系统中的一组接口提供一个一致的界面 Facade一个典型应用就是数据库JDBC的应用如下例对数据库的操作 public class DBCompare { Connection conn = null PreparedStatement prep = null ResultSet rset = null try { ClassforName( <driver> )newInstance() conn = DriverManagergetConnection( <database> ) String sql = SELECT * FROM <table> WHERE <column name> = ? prep = connprepareStatement( sql ) prepsetString( <column value> ) rset = prepexecuteQuery() if( rsetnext() ) {Systemoutprintln( rsetgetString( <column name ) ) } } catch( SException e ) { eprintStackTrace() } finally { rsetclose() prepclose() connclose() } } 上例是Jsp中最通常的对数据库操作办法 在应用中经常需要对数据库操作每次都写上述一段代码肯定比较麻烦需要将其中不变的部分提炼出来做成一个接口这就引入了facade外观对象如果以后我们更换ClassforName中的<driver>也非常方便比如从Mysql数据库换到Oracle数据库只要更换facade接口中的driver就可以 我们做成了一个Facade接口使用该接口上例中的程序就可以更改如下 public class DBCompare { String sql = SELECT * FROM <table> WHERE <column name> = ? try { Mysql msql=new mysql(sql) prepsetString( <column value> ) rset = prepexecuteQuery() if( rsetnext() ) { Systemoutprintln( rsetgetString( <column name ) ) } } catch( SException e ) { eprintStackTrace() } finally { mysqlclose() mysql=null } } 可见非常简单所有程序对数据库访问都是使用改接口降低系统的复杂性增加了灵活性 如果我们要使用连接池也只要针对facade接口修改就可以 由上图可以看出facade实际上是个理顺系统间关系降低系统间耦合度的一个常用的办法也许你已经不知不觉在使用尽管不知道它就是facade |