读书人

设计形式之略见一斑(外观模式Facade)

发布时间: 2012-11-06 14:07:00 作者: rapoo

设计模式之略见一斑(外观模式Facade)

外观模式又称门面模式,它是为了给子系统中提供一个一致的界面,从面定义了一个高层接口 ,这个接口使得这一子系统更加容易使用。定义中提到的子系统指在设计中为了降低复杂性根据一定的规则,对系统进行的划分,子系统封装有一些类,客户程序在使用子系统的时候,可能会像下图一样零乱。

设计形式之略见一斑(外观模式Facade)


?上面的实现中,客户紧紧依赖在子系统的实现,如果子系统发生了变化,极有可能响应到客户类的调用,而且在子系统在不断优化时会产生更多的小类。

? 外观模式就是为了解决这种问题而产生的,下面是使用了门用模式后的图


设计形式之略见一斑(外观模式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模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候极为重要。

?
?

1 楼 bo_hai 2011-02-16 JAVA程序没有讲明白这种设计模式。

读书人网 >软件开发

热点推荐