<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 外觀設計模式 > 原文: [https://howtodoinjava.com/design-patterns/structural/facade-design-pattern/](https://howtodoinjava.com/design-patterns/structural/facade-design-pattern/) **外觀設計模式**為子系統中的一組接口提供了統一的接口。 外觀定義了**更高級別的接口**,使子系統更易于使用。 ## 1.何時使用外觀模式 外觀模式是**結構型設計模式**中的一種,另外還有四個[設計模式](https://howtodoinjava.com/gang-of-four-java-design-patterns/)。 當我們有一個復雜的系統要以簡化的方式向客戶公開時,外觀模式是合適的。 其目的是將內部復雜性隱藏在從外部看起來很簡單的單個接口后面。 外觀還可以將使用系統的代碼與子系統的細節分離開來,從而使以后修改系統變得更加容易。 ## 2.現實世界中的外觀示例 為了了解外觀,讓我們舉一個非常簡單的臺式計算機示例。 當我們必須啟動計算機時,我們要做的就是按下開始按鈕。 我們真的不在乎計算機硬件和軟件中包含什么。 這是外觀模式的一個示例。 在 Java 編程中,我們必須已連接到數據庫以獲取一些數據。 我們只是調用方法`dataSource.getConnection()`來獲取連接,但是在內部發生了很多事情,例如加載驅動程序,創建連接或從池中獲取連接,更新統計信息,然后將連接引用返回給調用者方法。 這是編程世界中外觀模式的另一個示例。 同樣,我們可以找到更多的示例,這些示例隱藏了許多內部復雜性,并為程序員提供了使用簡單的接口來與系統一起工作。 所有這些都是外觀示例。 ## 3.外觀設計模式示例 讓我們為演示目的編寫自己的外觀實現。 在此示例中,我們將創建一個報告生成器,該報告生成器具有多個步驟來創建任何報告。 例如,它將首先創建報告的頁眉,頁腳,添加數據行,格式化報告,然后以所需的格式(pdf,html 等)編寫報告。 使用`ReportGeneratorFacade`,我們將隱藏所有這些步驟并公開易于使用的方法。 ```java 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; } } ``` ```java public class ReportHeader { } ``` ```java public class ReportFooter { } ``` ```java public class ReportData { } ``` ```java public enum ReportType { PDF, HTML } ``` ```java 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 } } ``` ```java import javax.activation.DataSource; 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; } } } ``` 讓我們測試一下外觀實現。 ```java import com.howtodoinjava.facade.ReportGeneratorFacade; import com.howtodoinjava.facade.ReportType; public class Main { public static void main(String[] args) throws Exception { ReportGeneratorFacade reportGeneratorFacade = new ReportGeneratorFacade(); reportGeneratorFacade.generateReport(ReportType.HTML, null, null); reportGeneratorFacade.generateReport(ReportType.PDF, null, null); } } ``` 程序輸出。 ```java Setting report header Setting report footer Setting report data HTML Report written Setting report header Setting report footer Setting report data Pdf Report written ``` ## 4.常見問題 #### 4.1 外觀模式的優點 請記住,外觀不會降低復雜性。 它只對外部系統和客戶端隱藏它。 因此,外觀模式的主要受益者僅是客戶端應用和其他系統。 它為客戶提供了一個簡單的接口,即,我們沒有為客戶展示一個復雜的子系統,而是為客戶提供了一個簡化的接口。 它還可以幫助我們減少客戶端需要處理的對象數量。 #### 4.2 外觀不限制對子系統的訪問 外觀不封裝子系統類或接口。 它只是提供了一個簡單的接口(或圖層),使我們的生活更輕松。 我們可以自由公開子系統或整個子系統本身的任何功能。 它只會使代碼看起來難看,否則它將起作用。 #### 4.3 外觀樣式與適配器樣式 在[適配器模式](https://howtodoinjava.com/design-patterns/structural/adapter-design-pattern-in-java/)中,我們嘗試更改接口,以便客戶端可以使用系統。 否則,該系統將很難被客戶端使用(甚至無法使用)。 外觀模式簡化了接口。 它為客戶端提供了一個與之交互的簡單接口(而不是復雜的子系統)。 #### 4.4 外觀模式與中介者模式 在中介者模式實現中,子系統知道中介者。 他們互相交談。 但是在外觀中,子系統不了解外觀,并且從外觀到子系統之間提供了單向通信。 #### 4.5 一個復雜子系統只有一個外觀? 一點也不。 我們可以為特定的復雜子系統創建任意數量的外觀。 這樣做的目的是使系統更易于使用。 它需要創建 N 個外觀,然后進行制作。 #### 4.6 外觀設計模式的挑戰 * 子系統與外觀層連接。 因此,您需要注意額外的編碼層。 * 當子系統的內部結構發生變化時,您還需要將這些變化合并到外觀層中。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看