12 外觀模式(Facade Design Pattern)

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

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

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

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

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

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

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

Facade Design Pattern – Set of Interfaces

我們可能有兩個(gè)幫助類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類獲取數(shù)據(jù)庫(kù)連接是外觀模式的一個(gè)很好的例子。

Facade Design Pattern Important Points

  • 對(duì)客戶端程序來說,外觀模式更像是一個(gè)helper類, 它不會(huì)隱藏系統(tǒng)的接口。是否使用外觀模式完全取決于客戶端代碼。
  • 外觀模式可以應(yīng)用到開發(fā)過程中的任意地方,通常的當(dāng)接口的數(shù)量越來越多系統(tǒng)越來越復(fù)雜時(shí)考慮使用它。
  • 子系統(tǒng)的接口不會(huì)意識(shí)到Facade的存在,他們也不應(yīng)該引用Facade類的任何方法。
  • 門面設(shè)計(jì)模式應(yīng)當(dāng)盡可能少的提供接口方法,它的目的是提供一個(gè)單一的接口而不是多個(gè)接口來解決一類問題。
  • 通過外觀模式可以為客戶端提供更友好的接口。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容