天天看點

Java外觀模式(Facade模式)

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

  1. public class DBCompare {

  2. Connection conn = null;

  3. PreparedStatement prep = null;

  4. ResultSet rset = null;

  5. try {

  6. Class.forName( "<driver>" ).newInstance();

  7.   conn = DriverManager.getConnection( "<database>" );

  8. String sql = "SELECT * FROM <table> WHERE <column name> = ?";

  9.   prep = conn.prepareStatement( sql );

  10.   prep.setString( 1, "<column value>" );

  11.   rset = prep.executeQuery();

  12. if( rset.next() ) {

  13. System.out.println( rset.getString( "<column name" ) );

  14. }

  15. } catch( SException e ) {

  16.   e.printStackTrace();

  17. } finally {

  18.   rset.close();

  19.   prep.close();

  20.   conn.close();

  21. }

  22. }

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

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

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

  1. public class DBCompare {

  2. String sql = "SELECT * FROM <table> WHERE <column name> = ?";  

  3. try {

  4. Mysql msql=new mysql(sql);

  5.   prep.setString( 1, "<column value>" );

  6.   rset = prep.executeQuery();

  7. if( rset.next() ) {

  8. System.out.println( rset.getString( "<column name" ) );

  9. }

  10. } catch( SException e ) {

  11.   e.printStackTrace();

  12. } finally {

  13.   mysql.close();

  14.   mysql=null;

  15. }

  16. }

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

如果我們要使用連接配接池,也隻要針對facade接口修改就可以。

Java外觀模式(Facade模式)

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

原文釋出時間為:2018-08-29

本文作者:HARRIES

本文來自雲栖社群合作夥伴“

Java雜記

”,了解相關資訊可以關注“

”。