在許多開源的框架中都充分的利用了設計模式這一概念,Struts典型的MVC模式的化身,Spring是工廠模式和單例模式的充分體現。在專案開發中,能充分利用設計模式的思想來考慮問題,來解決問題,來通過程式碼去實現。不但可以提高程式碼的質量,對程式的擴充套件,重用帶來很大方便。其實我們專案中用設計模式程式設計就是加了一個封裝層,減少客戶必須處理的物件的數量。
      在設計模式中一般都遵循這樣的原則:
      (1)按介面程式設計。
      (2)儘量用聚合代替繼承。
      (3)找出變化並封裝之。
     上面主要講了一些設計模式的作用和原則。接下來我要講的是在實際專案中應用的比較多的其中一個模式—–>門面模式(Facade),有的叫正面,外觀模式,其實都是一個意識,都指的這個模式。它也是美國著名的四人幫(GOF)寫的23種模式之一。
       簡單的理解:我們需要用一種比原有的方法更簡單的方法與系統互動,或者說,我們需要以一種特殊的方式使用系統。主要是為子系統中的一組介面提供一個統一的介面。Facade模式定義了一個更高的介面,使子系統更加容易使用。它的意圖要求一個一致的高層介面。
       我簡單的用程式碼方式表現出來。我寫的都是一些虛擬碼。主要是來講清Facade的應用。
       以簡單的登入為例:
       我們一般都會寫一個DAO層,主要封裝了資料庫裡增,刪,該,查作用。
我們一般會寫一個介面:簡單宣告一個方法。根據使用者名稱和密碼來從資料庫中查詢是否存在。
public interface UserDAO {
   public abstract List findByUserName(Object userName,Object passWord);
 public abstract List findByUserName(Object userName);
 public abstract List findByUserPassword(Object userPassword);
 public abstract List findByUserPortraitUrl(Object userPortraitUrl);
 public abstract List findByEmail(Object email);
 public abstract List findByUrl(Object url);
 public abstract List findByRole(Object role);
}
 然後再寫一個介面的實現:
public class UserDAOImp implements W3csTUserDAO {
         public  List findByUserName(Object userName,Object passWord){
         //判斷使用者是否存在。存在返回一個list,反之為null.
 }
  public List findByUserName(Object userName){
    //實現
}
 public  List findByUserPassword(Object userPassword){
    //實現
}

 public   List findByUserPortraitUrl(Object userPortraitUrl){
    //實現
}

 public  List findByEmail(Object email){
    //實現
}

 public  List findByUrl(Object url){
    //實現
}

 public  List findByRole(Object role){
    //實現
}

}
    我們一般應用門面模式是在業務層。我們在寫一個業務方法:和上面一樣先宣告一個介面。
public interface UserService{
      public boolean login(Stirng userName,String passWord);
}
   在寫一個業務介面的實現。
  public class UserServiceImp implements UserService{
     private UserDAO userDao;
     public void setUserDAO(UserDAO userDao){
             this.userDao = userDao;
 }
     public UserDAO getUserDao(){
               return userDao;         
    }
     public boolean login(Stirng userName,String passWord){
            if(userDao.findByUserName(userName,passWord)!=null){
       //合法使用者,登入成功。
  }else{
         //登入失敗。 
}
  }
}
 
      我們可以看到我們在業務層中對DAO層又進行了一層封裝。這就是Facade模式的簡單應用的場合,有人可能會想為什麼不直接呼叫DAO層呢?因為在實際的應用中,也許DAO中的方法太多,而我們實際用到的方法只是其中的一個或幾個,所有把業務中用到的方法在提出出來封裝處理,對呼叫者來說也很方便,它不會直接接觸到DAO,我們把DAO封裝在Service層中是為了讓各個層職責分明。這樣做還有一個用處,我們可能還會對使用者的登入資訊進行記錄,這是我們就可以在Service層中處理,以及事務等。之所以把它封裝在業務層中,避免了使用者直接對資料庫DAO層的直接操作,對使用者來說是透明的。這樣就簡單了實現了鬆耦合。
      Facade模式可以應用於:
  <1>不需要使用一個複雜系統的所有功能,而且可以建立一個新的類,包含訪問系統的所用規則。如果只需要使用系統的部分功能,那麼你為新類建立的API將比原有系統的API簡單的多。
  <2>希望封裝或者隱藏原系統。
  <3>希望使用原系統的功能,而且還希望增加一些附件功能。