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");} }顯卡的啟動和關閉:
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();} }運行結果:
main board?is?opennet card?is?openvideo card?is?open我們只需要調用門面對象的啟動方法,就相當于調用了三個部件的啟動方法,我們無需知道門面你不是怎么調用的,而且,如果電腦的組件進行了擴展,我們只需要在門面類中進行功能的擴展就可以了,客戶是感覺不到的。 在上面的代碼中,我們發現門面類里只調用了啟動的方法,沒有關閉的方法給我們調用,這就是門面設計模式的另一個優勢,它可以將不必要對客戶開放的方法隱藏起來,以保證安全性。
例如在tomcat中,當執行doGet或者doPost的時候,其中的參數request和response已經是門面類,因為tomcat在這之前,會調用:
filterChain.doFilter(request.getRequest(),?response.getResponse())而這兩個參數的源碼如下:
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就是一個典型的門面設計模式。
作者:Mazin
https://my.oschina.net/u/3441184/blog/889706
總結
以上是生活随笔為你收集整理的Java中的门面设计模式,非常有用!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美图每天亿级消息存储演进——从Redis
- 下一篇: 面试必问:如何访问 Redis 中的海量