設計模式之Facade(外觀)

来源:互联网 发布:网络英雄洛克人第一部 编辑:程序博客网 时间:2024/05/22 00:50

Facade的定義: 爲子系統中的一組介面提供一個一致的介面。

Facade一個典型應用就是資料庫JDBC的應用,如下例對資料庫的操作:

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();
  
}
}

上例是Jsp中最通常的對資料庫操作辦法。

在應用中,經常需要對資料庫操作,每次都寫上述一段代碼肯定比較麻煩,需要將其中不變的部分提煉出來,做成一個介面,這就引入了facade外觀物件。如果以後我們更換Class.forName中的<driver>也非常方便,比如從Mysql資料庫換到Oracle資料庫,只要更換facade介面中的driver就可以。

我們做成了一個Facade介面,使用該介面,上例中的程式就可以更改如下:

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;
  
}
}

可見非常簡單,所有程式對資料庫訪問都是使用改介面,降低系統的複雜性,增加了靈活性。

如果我們要使用連接池,也只要針對facade介面修改就可以。

 

由上圖可以看出, facade實際上是個理順系統間關係,降低系統間耦合度的一個常用的辦法,也許你已經不知不覺在使用,儘管不知道它就是facade


 
原创粉丝点击