java的設計模式 - 外觀模式(Facade)

目的

看臉模式目的很簡單,就是給用戶留個好印象,不想讓用戶關注系統中的具體細節,關注系統的外表(暴露出來的接口)就行了。一些 GUI 的菜單也好,SDK 也好或多或少也會用到這種思想。這更多的是一種思想,也沒有說必定這樣實現纔是外觀模式的 。參考維基百科的例子,電腦有 cpu、內存、磁盤等組成,cpu 有邏輯運算部分、有取指令部分;內存要負責存儲指令數據;磁盤要控制磁道等等,這些都不是用戶關心的,用戶須要一個開機按鈕罷了。java

在《深刻剖析 Tomcat》(英文名:《How tomcat works》)中也介紹了一下 Tomcat 中 Facade 模式的使用,下面來看看Tomcat 中 Facade 模式吧tomcat

Tomcat 中的 Facade 模式

Tomcat 中的 Facade 模式弄得有點像代理模式的。場景是這樣的,Tomcat 中 Request 除了實現了 ServletRequest 接口外,還會有額外的一些函數,而這些函數須要被其餘類調用,但這些方法不該該暴露給上層,由於上層應該專一於 ServletRequest 的實現。因而在 Tomcat 中會使用 Facade 模式了。ide

原來的 process 處理請求是這樣的函數

public class ServletProcess {
    public void process(Request request, Response response){
        //....
        servlet = (Servlet) myClass.newInstance();
        servlet.service((ServletRequest) request, (ServletResponse) response);
    }
}

而使用 Facade 後是這樣this

public class ServletProcess {
    public void process(Request request, Response response){
        //....
        RequestFacade requestFacade = new RequestFacade(request);
        ResponseFacade responseFacade = new ResponseFacade(response);
        servlet = (Servlet) myClass.newInstance();
        servlet.service((ServletRequest) requestFacade, (ServletResponse) responseFacade);
    }
}

爲了達到這種效果,RequestFacade 使用了相似代理模式的實現方式。代理

public class RequestFacade implements HttpServletRequest {

   private ServletRequest request;

    public RequestFacade(ServletRequest request) {
        this.request = request;
    }

    @Override
    public String getAuthType() {
        return request.getAuthType();
    }
}

對象裏有個 ServletRequest 對象,而 RequestFacade 的全部方法都會委託給 ServletRequest 調用。code

固然,逐個函數手動寫委託調用好煩,好浪費時間的,我推薦使用了 lombok ,像是魔法同樣,輕輕一個 @Delegate 就完事了對象

public class RequestFacade implements HttpServletRequest {
    
    @Delegate
    private ServletRequest request;
}

用 UML 分析是這樣的,未使用 Facade 模式前
blog

使用 Facade 模式以後
接口

相關文章
相關標籤/搜索