java設計模式之Facade門面模式


java設計模式之Facade門面模式


門面設計模式為子系統中的一組接口提供了一個同意的接口,Facade定義了一個更高級別的接口,子子系統更易於使用。

1.什么時候使用Facade模式?

Facade設計模式是java中常用的一種結構式的設計模式,當我們想要以簡化的方式向客戶端公開一個復雜的系統時,Facade是最合適的,它的目的是將內部復雜性隱藏起來,對外部提供一個簡單的使用方式。Facade還可以將系統的代碼從子系統的細節中解耦出來,便於以后維護。

2.Facade模式示例

要了解Facade,我們舉兩個非常簡單的例子:當我們啟動計算機時,我們所要做的就是按一下啟動按鈕,我們不關心計算機內部是如何運行的。在java編程中,我們必須連接到數據庫,才能獲取數據,我們只是調用dataSource.getConnection()來獲取連接,但內部會發生很多事情,例如加載驅動等。下面我們來用代碼來演示一下:

是這樣的:我們想要一個報告生成器,它有多個步驟來創建任何報告,例如,它應首先創建報告頁眉、頁腳、添加數據行、格式化報告,然后報告的格式是pdf、html等。

代碼:

public class ReportHeader {
}
public class ReportFooter {
}
public class ReportData {
}
public enum ReportType {
PDF, HTML
}
public class Report { private ReportHeader header; private ReportData data; private ReportFooter footer; public ReportHeader getHeader() { return header; } public void setHeader(ReportHeader header) { System.out.println("Setting report header"); this.header = header; } public ReportData getData() { return data; } public void setData(ReportData data) { System.out.println("Setting report data"); this.data = data; } public ReportFooter getFooter() { return footer; } public void setFooter(ReportFooter footer) { System.out.println("Setting report footer"); this.footer = footer; } }
public class ReportWriter {

    public void writeHtmlReport(Report report, String location) {
        System.out.println("HTML Report written");

        //implementation
    }

    public void writePdfReport(Report report, String location) {
        System.out.println("Pdf Report written");

        //implementation
    }
}
public class ReportGeneratorFacade
{
    public static void generateReport(ReportType type, DataSource dataSource, String location)
    {
        if(type == null || dataSource == null)
        {
            //throw some exception
        }
        //Create report
        Report report = new Report();

        report.setHeader(new ReportHeader());
        report.setFooter(new ReportFooter());

        //Get data from dataSource and set to ReportData object

        report.setData(new ReportData());

        //Write report
        ReportWriter writer = new ReportWriter();
        switch(type)
        {
            case HTML:
                writer.writeHtmlReport(report, location);
                break;

            case PDF:
                writer.writePdfReport(report, location);
                break;
        }
    }
}

運行測試:

public static void main(String[] args) throws Exception
    {
        ReportGeneratorFacade reportGeneratorFacade = new ReportGeneratorFacade();
         
        reportGeneratorFacade.generateReport(ReportType.HTML, null, null);
         
        reportGeneratorFacade.generateReport(ReportType.PDF, null, null);
    }

程序輸出:

Setting report header
Setting report footer
Setting report data
HTML Report written
 
 
Setting report header
Setting report footer
Setting report data
Pdf Report written

3.常見問題

3.1Facade模式的優點:
門面設計模式並沒有降低程序的復雜性,只是對外部隱藏內部的復雜,因此門面模式的受益者是使用方客戶端的應用程序和其他系統。
3.2Facade依然要面對的挑戰:
  • 子系統與facade門面相連,需要額外的代碼層。
  • 當子系統的內部結構發生變化時,需要將這些變化合並到門面設計中。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM