Java面板模式(Facade模式)__設計模式

來源:互聯網
上載者:User
面板模式(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。

面板模式  概述
    為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
 適用性
    1.當你要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越      複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容      易對子系統進行定製,但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。      Facade可以提供一個簡單的預設視圖,這一視圖對大多數使用者來說已經足夠,而那些需      要更多的可定製性的使用者可以越過facade層。    2.客戶程式與抽象類別的實現部分之間存在著很大的依賴性。引入facade將這個子系統與客      戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。    3.當你需要構建一個階層的子系統時,使用facade模式定義子系統中每層的進入點。      如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們      之間的依賴關係。
 參與者
    1.Facade      知道哪些子系統類負責處理請求。      將客戶的請求代理給適當的子系統對象。    2.Subsystemclasses      實現子系統的功能。      處理由Facade對象指派的任務。      沒有facade的任何相關資訊;即沒有指向facade的指標。
 類圖  例子 Facade
public class Facade {    ServiceA sa;        ServiceB sb;        ServiceC sc;        public Facade() {        sa = new ServiceAImpl();        sb = new ServiceBImpl();        sc = new ServiceCImpl();     }        public void methodA() {        sa.methodA();        sb.methodB();    }        public void methodB() {        sb.methodB();        sc.methodC();    }        public void methodC() {        sc.methodC();        sa.methodA();    }}
Subsystemclasses
public class ServiceAImpl implements ServiceA {    public void methodA() {        System.out.println("這是服務A");    }}
public class ServiceBImpl implements ServiceB {    public void methodB() {        System.out.println("這是服務B");    }}
public class ServiceCImpl implements ServiceC {    public void methodC() {        System.out.println("這是服務C");    }}
Test
public class Test {        public static void main(String[] args) {    ServiceA sa = new ServiceAImpl();    ServiceB sb = new ServiceBImpl();                sa.methodA();        sb.methodB();                System.out.println("========");        //facade        Facade facade = new Facade();        facade.methodA();        facade.methodB();    }}
result
這是服務A這是服務B========這是服務A這是服務B這是服務B這是服務C

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.