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

 
 

你可能感兴趣的:(设计模式,数据结构,sql,mysql,jsp)