12 外觀模式(Facade Design Pattern)

外觀模式或者門(mén)面模式(又是一個(gè)奇怪的名字)犯戏,外觀模式用于幫助客戶端程序更容易的與系統(tǒng)代碼交互。

外觀模式隱藏了系統(tǒng)的復(fù)雜性,并向客戶端提供了一個(gè)可以訪問(wèn)的系統(tǒng)的接口饲漾。為子系統(tǒng)的一組接口提供了一個(gè)統(tǒng)一的訪問(wèn)接口,使子系統(tǒng)更容易被訪問(wèn)或使用缕溉。

簡(jiǎn)單的說(shuō)考传,該模式就是把一些復(fù)雜的流程封裝成一個(gè)接口供給外部用戶更簡(jiǎn)單的使用。

假設(shè)我們有一個(gè)具有很多接口的應(yīng)用程序证鸥,用吧MySql/Oracle等數(shù)據(jù)庫(kù)并生成不同類(lèi)型的報(bào)告僚楞,例如HTML報(bào)告勤晚,PDF報(bào)告等。

所以我們將有不同的接口來(lái)處理不同類(lèi)型的數(shù)據(jù)庫(kù)∪郑現(xiàn)在赐写,客戶端應(yīng)用程序可以使用這些接口來(lái)獲取所需的數(shù)據(jù)庫(kù)連接并生成報(bào)告。

但當(dāng)業(yè)務(wù)復(fù)雜性不斷增加或接口的行為命名令人困惑膜赃,客戶端程序會(huì)發(fā)現(xiàn)很難管理它挺邀。

所以這里我們可以使用外觀模式,提供一個(gè)頂層接口包裝來(lái)幫助客戶端程序跳座。

Facade Design Pattern – Set of Interfaces

我們可能有兩個(gè)幫助類(lèi)MySqlHelper和OracleHelper

public class MySqlHelper {

    public static Connection getMySqlDBConnection(){
        //get MySql DB connection using connection parameters
        return null;
    }

    public void generateMySqlPDFReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

    public void generateMySqlHTMLReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }
}

public class OracleHelper {

    public static Connection getOracleDBConnection(){
        //get Oracle DB connection using connection parameters
        return null;
    }

    public void generateOraclePDFReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

    public void generateOracleHTMLReport(String tableName, Connection con){
        //get data from table and generate pdf report
    }

}

Facade Design Pattern Interface

We can create a Facade pattern interface like below. Notice the use of Java Enum for type safety.

public class HelperFacade {

    public static void generateReport(DBTypes dbType, ReportTypes reportType, String tableName){

        Connection con = null;
        switch (dbType){
            case MYSQL:
                con = MySqlHelper.getMySqlDBConnection();
                MySqlHelper mySqlHelper = new MySqlHelper();
                switch(reportType){
                    case HTML:
                        mySqlHelper.generateMySqlHTMLReport(tableName, con);
                        break;
                    case PDF:
                        mySqlHelper.generateMySqlPDFReport(tableName, con);
                        break;
                }
                break;
            case ORACLE:
                con = OracleHelper.getOracleDBConnection();
                OracleHelper oracleHelper = new OracleHelper();
                switch(reportType){
                    case HTML:
                        oracleHelper.generateOracleHTMLReport(tableName, con);
                        break;
                    case PDF:
                        oracleHelper.generateOraclePDFReport(tableName, con);
                        break;
                }
                break;
        }

    }

    public static enum DBTypes{
        MYSQL,ORACLE;
    }

    public static enum ReportTypes{
        HTML,PDF;
    }
}

Facade Design Pattern Client Program

測(cè)試程序

public class FacadePatternTest {

    public static void main(String[] args) {
        String tableName="Employee";

        //generating MySql HTML report and Oracle PDF report without using Facade
        Connection con = MySqlHelper.getMySqlDBConnection();
        MySqlHelper mySqlHelper = new MySqlHelper();
        mySqlHelper.generateMySqlHTMLReport(tableName, con);

        Connection con1 = OracleHelper.getOracleDBConnection();
        OracleHelper oracleHelper = new OracleHelper();
        oracleHelper.generateOraclePDFReport(tableName, con1);

        //generating MySql HTML report and Oracle PDF report using Facade
        HelperFacade.generateReport(HelperFacade.DBTypes.MYSQL, HelperFacade.ReportTypes.HTML, tableName);
        HelperFacade.generateReport(HelperFacade.DBTypes.ORACLE, HelperFacade.ReportTypes.PDF, tableName);
    }

}

正如你所看到的端铛,使用Facade模式避免在客戶端擁有大量邏輯,使程序更簡(jiǎn)單更清晰疲眷。 JDBC Driver Manager類(lèi)獲取數(shù)據(jù)庫(kù)連接是外觀模式的一個(gè)很好的例子禾蚕。

Facade Design Pattern Important Points

  • 對(duì)客戶端程序來(lái)說(shuō),外觀模式更像是一個(gè)helper類(lèi)咪橙, 它不會(huì)隱藏系統(tǒng)的接口夕膀。是否使用外觀模式完全取決于客戶端代碼。
  • 外觀模式可以應(yīng)用到開(kāi)發(fā)過(guò)程中的任意地方美侦,通常的當(dāng)接口的數(shù)量越來(lái)越多系統(tǒng)越來(lái)越復(fù)雜時(shí)考慮使用它产舞。
  • 子系統(tǒng)的接口不會(huì)意識(shí)到Facade的存在,他們也不應(yīng)該引用Facade類(lèi)的任何方法菠剩。
  • 門(mén)面設(shè)計(jì)模式應(yīng)當(dāng)盡可能少的提供接口方法易猫,它的目的是提供一個(gè)單一的接口而不是多個(gè)接口來(lái)解決一類(lèi)問(wèn)題。
  • 通過(guò)外觀模式可以為客戶端提供更友好的接口具壮。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末准颓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棺妓,更是在濱河造成了極大的恐慌攘已,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜跑,死亡現(xiàn)場(chǎng)離奇詭異样勃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)性芬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)峡眶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人植锉,你說(shuō)我怎么就攤上這事辫樱。” “怎么了俊庇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵狮暑,是天一觀的道長(zhǎng)鸡挠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)心例,這世上最難降的妖魔是什么宵凌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮止后,結(jié)果婚禮上瞎惫,老公的妹妹穿的比我還像新娘。我一直安慰自己译株,他們只是感情好瓜喇,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著歉糜,像睡著了一般乘寒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匪补,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天伞辛,我揣著相機(jī)與錄音,去河邊找鬼夯缺。 笑死蚤氏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踊兜。 我是一名探鬼主播竿滨,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捏境!你這毒婦竟也來(lái)了于游?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤垫言,失蹤者是張志新(化名)和其女友劉穎贰剥,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筷频,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸠澈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了截驮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡际度,死狀恐怖葵袭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乖菱,我是刑警寧澤坡锡,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布蓬网,位于F島的核電站,受9級(jí)特大地震影響鹉勒,放射性物質(zhì)發(fā)生泄漏帆锋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一禽额、第九天 我趴在偏房一處隱蔽的房頂上張望锯厢。 院中可真熱鬧,春花似錦脯倒、人聲如沸实辑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剪撬。三九已至,卻和暖如春悠反,著一層夾襖步出監(jiān)牢的瞬間残黑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工斋否, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梨水,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓如叼,卻偏偏與公主長(zhǎng)得像冰木,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子笼恰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348