設計模式之Facade(外觀)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值