设计模式之略见一斑(外观模式Facade)
外观模式又称门面模式,它是为了给子系统中提供一个一致的界面,从面定义了一个高层接口 ,这个接口使得这一子系统更加容易使用。定义中提到的子系统指在设计中为了降低复杂性根据一定的规则,对系统进行的划分,子系统封装有一些类,客户程序在使用子系统的时候,可能会像下图一样零乱。
?上面的实现中,客户紧紧依赖在子系统的实现,如果子系统发生了变化,极有可能响应到客户类的调用,而且在子系统在不断优化时会产生更多的小类。
? 外观模式就是为了解决这种问题而产生的,下面是使用了门用模式后的图

?这样就明显减少了客户程序和子系统之间的偶合,增加了可维护性。
?
例子:
??数据库连接这个例子在我们日常中很常用,在用JSP做页面开发的时候,我们经常会用到连接数据库,很多初学者都是直接用下面的代码(直接连接数据库,然后获得连接后直接进行增删改查)
public class DBCompare { Connection conn = null; PreparedStatement prep = null; ResultSet rset = null; try { Class.forName( "<driver>" ).newInstance(); conn = DriverManager.getConnection( "<database>" ); String sql = "SELECT * FROM <table> WHERE <column name> = ?"; prep = conn.prepareStatement( sql ); prep.setString( 1, "<column value>" ); rset = prep.executeQuery(); if( rset.next() ) { System.out.println( rset.getString( "<column name" ) ); } } catch( SException e ) { e.printStackTrace(); } finally { rset.close(); prep.close(); conn.close(); }}?
但是这样的代码很有弊端,如我们如果想要换个数据库,这个时候就要大量改动代码
为了避免这种情况,我们就可以把获得连接抽象出来,从而在每次需要对数据库进行操作的时候,只需要获得连接。甚至也可以建立一个连接池。
public class DBCompare { String sql = "SELECT * FROM <table> WHERE <column name> = ?"; try { Mysql msql=new mysql(sql); prep.setString( 1, "<column value>" ); rset = prep.executeQuery(); if( rset.next() ) { System.out.println( rset.getString( "<column name" ) ); } } catch( SException e ) { e.printStackTrace(); } finally { mysql.close(); mysql=null; }}?
优点:
1)对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便
2)它实现了子系统与客户之间在的耦合关系,而子系统内部的功能组件往往是紧耦合的,松耦合关系使得子系统的组件变化不会影响到它的客户,facad模式有助于建立层次结构系统,也有助于对对象之间原依赖关系分层,facade模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候极为重要。
?
?