看臉模式目的很簡單,就是給用戶留個好印象,不想讓用戶關注系統中的具體細節,關注系統的外表(暴露出來的接口)就行了。一些 GUI 的菜單也好,SDK 也好或多或少也會用到這種思想。這更多的是一種思想,也沒有說必定這樣實現纔是外觀模式的 。參考維基百科的例子,電腦有 cpu、內存、磁盤等組成,cpu 有邏輯運算部分、有取指令部分;內存要負責存儲指令數據;磁盤要控制磁道等等,這些都不是用戶關心的,用戶須要一個開機按鈕罷了。java
在《深刻剖析 Tomcat》(英文名:《How tomcat works》)中也介紹了一下 Tomcat 中 Facade 模式的使用,下面來看看Tomcat 中 Facade 模式吧tomcat
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 模式以後
接口