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門面相連,需要額外的代碼層。
- 當子系統的內部結構發生變化時,需要將這些變化合並到門面設計中。