Java中的門面設(shè)計(jì)模式及如何用代碼實(shí)現(xiàn)

門面設(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轨奄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拒炎,更是在濱河造成了極大的恐慌挪拟,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击你,死亡現(xiàn)場(chǎng)離奇詭異玉组,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丁侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門惯雳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸿摇,你說我怎么就攤上這事石景。” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵潮孽,是天一觀的道長(zhǎng)揪荣。 經(jīng)常有香客問我,道長(zhǎng)往史,這世上最難降的妖魔是什么仗颈? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮椎例,結(jié)果婚禮上挨决,老公的妹妹穿的比我還像新娘。我一直安慰自己粟矿,他們只是感情好凰棉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布损拢。 她就那樣靜靜地躺著陌粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪福压。 梳的紋絲不亂的頭發(fā)上掏秩,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音荆姆,去河邊找鬼蒙幻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胆筒,可吹牛的內(nèi)容都是我干的邮破。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼仆救,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼抒和!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彤蔽,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤摧莽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顿痪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镊辕,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蚁袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了征懈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揩悄,死狀恐怖卖哎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤棉饶,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布厦章,位于F島的核電站,受9級(jí)特大地震影響照藻,放射性物質(zhì)發(fā)生泄漏袜啃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一幸缕、第九天 我趴在偏房一處隱蔽的房頂上張望群发。 院中可真熱鬧,春花似錦发乔、人聲如沸熟妓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽起愈。三九已至,卻和暖如春译仗,著一層夾襖步出監(jiān)牢的瞬間抬虽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工纵菌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阐污,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓咱圆,卻偏偏與公主長(zhǎng)得像笛辟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子序苏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容