門面模式

一、概念
java

    門面模式,是指提供一個統一的接口去訪問多個子系統的多個不一樣的接口,它爲子系統中的一組接口提供一個統一的高層接口。使得子系統更容易使用。tomcat

二、類圖session

三、代碼架構

package com.yujin.facade;
/**
 * 付款類
 */
public class Payment {
  
  public String pay(double money){
    String food = "宮保雞丁";
    System.err.println("你已支付:¥"+money+"購買了("+food+")");
    return food;
  }
}
package com.yujin.facade;
/**
 * 製做菜餚 
 */
public class Cook {
  
  public void cook(String food){
    System.err.println("五星級廚師正在爲您精心製做"+food);
  }
}
package com.yujin.facade;
/**
 * 服務員傳菜
 */
public class Waiter {
  
  public void writer(String food){
    System.err.println("服務員正在爲您傳"+food);
  }
}
package com.yujin.facade;
/*
 * 在這裏咱們能夠爲Payment Cook Watier設計一個門面
 */
public class Facade {
  //方法一
  private Payment p = new Payment();
  private Cook c = new Cook();
  private Waiter w = new Waiter();
  
  public void serveFood() {
    String food = p.pay(12.7);
    c.cook(food);
    w.writer(food);
}
}
package com.yujin.facade;
/**
 * 傳統模式下開發顧客(消費者)
 * 缺點:耦合度太大 
 */
public class Customer {
  
  public void haveDinner(){
   /* Payment p = new Payment();
    Cook c = new Cook();
    Waiter w = new Waiter();
    String food = p.pay(12.5f);
    c.cook(food);
    w.writer(food);*/
    
    //
    Facade f = new Facade();
    f.serveFood();
  }
  
  /**
   * 測試
   * @param args
   * date: 2016年2月17日-上午11:55:50
   * since: version1.0
   * author: yujin
   */
  public static void main(String[] args) {
    new Customer().haveDinner();
  }
}

四、優缺點測試

(1)優勢spa

● 鬆散耦合設計

門面模式鬆散了客戶端與子系統的耦合關係,讓子系統內部的模塊能更容易擴展和維護。code

● 簡單易用orm

門面模式讓子系統更加易用,客戶端再也不須要了解子系統內部的實現,也不須要跟衆多子系統內部的模塊進行交互,只須要跟門面類交互就能夠了。接口

● 更好的劃分訪問層次

經過合理使用Facade,能夠幫助咱們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把須要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。

(2)缺點

    不符合開閉原則。所謂的開閉原則是軟件工程裏面一個最基本的原則:對擴展開放,對修改關閉。換句話說,你的系統能夠提供新的功能模塊而沒必要進行修改。

五、經驗之談---門面模式

(1)tomcat應用

request組件

(2)Spring應用

    Spring的HibernateTemplate類就是使用的門面模式:當咱們的程序使用Hibernate的find()方法時,程序只要一行代碼便可獲得查詢返回的List。但實際上該find()方法後隱藏了以下代碼:

Session session = sf.openSession();
Query query = session.createQuery(hql);
for(int i=0; i<args.length; i++) {
    query.setParameter(i, args[i]);
}
query.list();

    所以咱們能夠認爲HibernateTemplate是SessionFactory,Session、Query等類的門面。當客戶端程序須要進行持久化查詢時,程序無需調用這些類,而是直接調用HibernateTemplate門面類中的相印方法便可。

(3)三層架構值門面模式

    JavaEE應用裏使用業務邏輯組件來封裝DAO組件也是典型的門面模式——每一個業務邏輯組件(通常是Service層)都是衆多DAO組件的門面,系統的控制器類無需直接訪問DAO組件,而是由業務邏輯方法來組合多個DAO方法以完成所需功能。而Action只需與業務邏輯組件交互便可。

相關文章
相關標籤/搜索