Java中的門面設計模式及如何用代碼實現

門面設計模式又叫外觀設計模式,其核心思想正如其字面意思,向用戶提供一個門戶,用戶只須要訪問這個門戶來獲取他們想要的數據,無需管理這個門戶內部的構成,也無需知道里面的運行流程等等,對於開發者來講,使用門面模式,咱們能夠只向用戶提供他們想要的東西,而不要暴露全部的信息。java

 

上面的摘要簡單描述了一下門面設計模式的思想,下面咱們經過平常生活中的例子來幫助你們理解這一思想:你們都知道,一個電腦的主機是由不少部件組成的,比較重要的有顯卡,CPU,主板,網卡,聲卡等。若是咱們須要使用計算機,那麼咱們就須要讓他們協調運做,好比簡單的開機動做,咱們須要開啓這些部件,可是在實際的操做中,咱們只須要按一下開機鍵,電腦就啓動了。這個開機鍵就是電腦門面,咱們只須要向這個門面發送指令,計算機的內部就就會自動運行一系列操做去啓動全部的部件,而不須要咱們手動一個一個的去啓動。並且最關鍵的是,計算機只向咱們暴露了一個開關,而沒有將其中的部件暴露給咱們,增長了其安全性,當計算機的啓動流程改變(操做擴展)時,用戶是感受不到的。下面咱們就將上面的舉例轉換成代碼的實現吧!主板的啓動和關閉:設計模式

public class MainBoard {

  public void start(){
    System.out.println("main board is open");
  }
  
  public void end(){
    System.out.println("main board is close");
  }
}

 

 

顯卡的啓動和關閉:tomcat

public class VideoCard {

  public void start(){
    System.out.println("video card is open");
  }
  
  public void end(){
    System.out.println("video card is close");
  }
}

 

 

網卡的啓動和關閉:安全

 

public class NetCard {

  public void start(){
    System.out.println("net card is open");
  }
  
  public void end(){
    System.out.println("net card is close");
  }
}

 

 

將上面的操做封裝到一個門面之中:併發

public class FacadeInstall {
  
  private MainBoard mainBoard;
  
  private NetCard netCard;
  
  private VideoCard videoCard;

  public FacadeInstall(){
    mainBoard = new MainBoard();
    netCard = new NetCard();
    videoCard = new VideoCard();
  }
  
  public void start(){
    mainBoard.start();
    netCard.start();
    videoCard.start();
  }
}

 

 

測試類:分佈式

public class FacadeTest {

  public static void main(String[] args) {
    FacadeInstall facadeInstall = new FacadeInstall();
    facadeInstall.start();
  }
}

 

 

運行結果:ide

main board is open

net card is open

video card is open

 

 

 

咱們只須要調用門面對象的啓動方法,就至關於調用了三個部件的啓動方法,咱們無需知道門面你不是怎麼調用的,並且,若是電腦的組件進行了擴展,咱們只須要在門面類中進行功能的擴展就能夠了,客戶是感受不到的。 在上面的代碼中,咱們發現門面類裏只調用了啓動的方法,沒有關閉的方法給咱們調用,這就是門面設計模式的另外一個優點,它能夠將沒必要要對客戶開放的方法隱藏起來,以保證安全性。高併發

 

例如在tomcat中,當執行doGet或者doPost的時候,其中的參數request和response已是門面類,由於tomcat在這以前,會調用:測試

filterChain.doFilter(request.getRequest(), response.getResponse())
 

 

而這兩個參數的源碼以下:this

public HttpServletRequest getRequest() {
        if (facade == null) {
            facade = new RequestFacade(this);
        }
        return facade;
    }


public HttpServletResponse getResponse() {
        if (facade == null) {
            facade = new ResponseFacade(this);
        }
        return (facade);
}
 

 

 

其實門面設計模式使用仍是比較普遍的,若是shiro的核心組件SecurityManager就是一個典型的門面設計模式。

本人免費整理了Java高級資料,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G,須要本身領取。
傳送門:https://mp.weixin.qq.com/s/igMojff-bbmQ6irCGO3mqA

相關文章
相關標籤/搜索