門面設(shè)計(jì)模式又叫外觀設(shè)計(jì)模式,其核心思想正如其字面意思缨伊,向用戶提供一個(gè)門戶摘刑,用戶只需要訪問這個(gè)門戶來獲取他們想要的數(shù)據(jù),無需管理這個(gè)門戶內(nèi)部的構(gòu)成倘核,也無需知道里面的運(yùn)行流程等等泣侮,對(duì)于開發(fā)者來說即彪,使用門面模式紧唱,我們可以只向用戶提供他們想要的東西,而不要暴露所有的信息隶校。
上面的摘要簡(jiǎn)單描述了一下門面設(shè)計(jì)模式的思想漏益,下面我們通過日常生活中的例子來幫助大家理解這一思想:大家都知道,一個(gè)電腦的主機(jī)是由很多部件組成的深胳,比較重要的有顯卡绰疤,CPU,主板舞终,網(wǎng)卡轻庆,聲卡等。如果我們需要使用計(jì)算機(jī)敛劝,那么我們就需要讓他們協(xié)調(diào)運(yùn)作余爆,比如簡(jiǎn)單的開機(jī)動(dòng)作,我們需要開啟這些部件夸盟,但是在實(shí)際的操作中蛾方,我們只需要按一下開機(jī)鍵,電腦就啟動(dòng)了上陕。這個(gè)開機(jī)鍵就是電腦門面桩砰,我們只需要向這個(gè)門面發(fā)送指令,計(jì)算機(jī)的內(nèi)部就就會(huì)自動(dòng)運(yùn)行一系列操作去啟動(dòng)所有的部件释簿,而不需要我們手動(dòng)一個(gè)一個(gè)的去啟動(dòng)亚隅。而且最關(guān)鍵的是,計(jì)算機(jī)只向我們暴露了一個(gè)開關(guān)庶溶,而沒有將其中的部件暴露給我們煮纵,增加了其安全性,當(dāng)計(jì)算機(jī)的啟動(dòng)流程改變(操作擴(kuò)展)時(shí)渐尿,用戶是感覺不到的醉途。下面我們就將上面的舉例轉(zhuǎn)換成代碼的實(shí)現(xiàn)吧!主板的啟動(dòng)和關(guān)閉:
public class MainBoard {
public void start(){
System.out.println("main board is open");
}
public void end(){
System.out.println("main board is close");
}
}
顯卡的啟動(dòng)和關(guān)閉:
public class VideoCard {
public void start(){
System.out.println("video card is open");
}
public void end(){
System.out.println("video card is close");
}
}
網(wǎng)卡的啟動(dòng)和關(guān)閉:
public class NetCard {
public void start(){
System.out.println("net card is open");
}
public void end(){
System.out.println("net card is close");
}
}
將上面的操作封裝到一個(gè)門面之中:
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();
}
}
測(cè)試類:
public class FacadeTest {
public static void main(String[] args) {
FacadeInstall facadeInstall = new FacadeInstall();
facadeInstall.start();
}
}
運(yùn)行結(jié)果:
main board is open
net card is open
video card is open
我們只需要調(diào)用門面對(duì)象的啟動(dòng)方法砖茸,就相當(dāng)于調(diào)用了三個(gè)部件的啟動(dòng)方法隘擎,我們無需知道門面你不是怎么調(diào)用的,而且凉夯,如果電腦的組件進(jìn)行了擴(kuò)展货葬,我們只需要在門面類中進(jìn)行功能的擴(kuò)展就可以了采幌,客戶是感覺不到的。
在上面的代碼中震桶,我們發(fā)現(xiàn)門面類里只調(diào)用了啟動(dòng)的方法休傍,沒有關(guān)閉的方法給我們調(diào)用,這就是門面設(shè)計(jì)模式的另一個(gè)優(yōu)勢(shì)蹲姐,它可以將不必要對(duì)客戶開放的方法隱藏起來磨取,以保證安全性。
例如在tomcat中柴墩,當(dāng)執(zhí)行doGet或者doPost的時(shí)候忙厌,其中的參數(shù)request和response已經(jīng)是門面類,因?yàn)閠omcat在這之前江咳,會(huì)調(diào)用:
filterChain.doFilter(request.getRequest(), response.getResponse())
而這兩個(gè)參數(shù)的源碼如下:
public HttpServletRequest getRequest() {
if (facade == null) {
facade = new RequestFacade(this);
}
return facade;
}
public HttpServletResponse getResponse() {
if (facade == null) {
facade = new ResponseFacade(this);
}
return (facade);
}
其實(shí)門面設(shè)計(jì)模式使用還是比較廣泛的逢净,如果shiro的核心組件SecurityManager就是一個(gè)典型的門面設(shè)計(jì)模式。
本人免費(fèi)整理了Java高級(jí)資料歼指,涵蓋了Java爹土、Redis、MongoDB踩身、MySQL胀茵、Zookeeper、Spring Cloud惰赋、Dubbo高并發(fā)分布式等教程宰掉,一共30G,需要自己領(lǐng)取赁濒。
傳送門:https://mp.weixin.qq.com/s/igMojff-bbmQ6irCGO3mqA