<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/behavioral/template-method-pattern/](https://howtodoinjava.com/design-patterns/behavioral/template-method-pattern/) **模板方法設計模式**是廣泛接受的行為型設計模式,用于在編程的上下文中實現某種[算法](//howtodoinjava.com/java-algorithms-implementations/)(固定的步驟集)。 它定義了執行多步算法的順序步驟,并且還可以選擇提供默認實現(根據要求)。 ```java Table of Contents Introduction Problem Statement Solution Code Implementation Key Design Points Popular implementations of template method pattern Summary ``` ## 介紹 您是否在編程中遇到過任何情況,每次都需要以固定順序定義一組特定步驟,以便可以由實現類強制執行? 如果是這樣,那么**模板方法模式**是適合您的解決方案,可用于有序執行這些步驟(算法)。 #### 模板方法模式的適用性 * 當我們有預定義的步驟來實現一些算法時。 * 當我們要避免重復代碼時,請在基類中移動通用實現和步驟。 現在,讓我們解決一個設計問題以詳細了解它。 ## 問題陳述 可以說,我們需要建造通常有某些步驟的任何房屋。 有些步驟具有默認實現,而某些步驟是針對沒有默認實現的實現者的。 **默認實現的步驟** * 基礎建設 * 屋頂施工 **默認實現為“否”的步驟** * 墻的建造 * 門窗施工 * 繪畫 * 室內裝修 我們希望**通過應用中的所有實現類依次執行這些步驟**。 ## 解決方案 在上述問題中,我們按照**固定順序**采取了某些步驟,所有建筑類別都必須遵循這些步驟。 因此,我們可以使用模板方法設計模式來解決此問題。 讓我們定義一個將所有步驟作為方法的基類`House`,將一個將依次調用中間步驟的*模板方法* `buildhouse()`定義為基類。 我們還將根據房屋的類型(例如`GlassWallHouse`和`ConcreteWallHouse`)創建派生類。 #### 類圖 ![template method design pattern class diagram](https://img.kancloud.cn/67/a6/67a61a6861211536986833b41ab1833a_675x459.png) 使用模板方法設計模式的類圖 ## 代碼實現 首先,我們需要創建一個名為`House`的抽象類,它將定義名為`buildHouse()`的模板方法。 **`House.java`** ```java package com.howtodoinjava.designpattern.template; /** * abstract class House containing template method buildHouse and implementation * of steps which is same for all types of houses. Those implementations have * been marked as final. */ public abstract class House { /** * This is the template method we are discussing. This method should be * final so that other class can't re-implement and change the order of the * steps. */ public final void buildhouse() { constructBase(); constructRoof(); constructWalls(); constructWindows(); constructDoors(); paintHouse(); decorateHouse(); } public abstract void decorateHouse(); public abstract void paintHouse(); public abstract void constructDoors(); public abstract void constructWindows(); public abstract void constructWalls(); /** * final implementation of constructing roof - final as all type of house * Should build roof in same manner. */ private final void constructRoof() { System.out.println("Roof has been constructed."); } /** * final implementation of constructing base - final as all type of house * Should build base/foundation in same manner. */ private final void constructBase() { System.out.println("Base has been constructed."); } } ``` 現在,我們將創建該類的兩個實現,可用于建造具體房屋和玻璃房屋。 **`ConcreteWallHouse.java`** ```java package com.howtodoinjava.designpattern.template; public class ConcreteWallHouse extends House { @Override public void decorateHouse() { System.out.println(“Decorating Concrete Wall House”); } @Override public void paintHouse() { System.out.println(“Painting Concrete Wall House”); } @Override public void constructDoors() { System.out.println(“Constructing Doors for Concrete Wall House”); } @Override public void constructWindows() { System.out.println(“Constructing Windows for Concrete Wall House”); } @Override public void constructWalls() { System.out.println(“Constructing Concrete Wall for my House”); } } ``` **`GlassWallHouse.java`** ```java package com.howtodoinjava.designpattern.template; public class GlassWallHouse extends House { @Override public void decorateHouse() { System.out.println("Decorating Glass Wall House"); } @Override public void paintHouse() { System.out.println("Painting Glass Wall House"); } @Override public void constructDoors() { System.out.println("Constructing Doors for Glass Wall House"); } @Override public void constructWindows() { System.out.println("Constructing Windows for Glass Wall House"); } @Override public void constructWalls() { System.out.println("Constructing Glass Wall for my House"); } } ``` ## 演示 讓我們嘗試建造兩種房屋。 ```java package com.howtodoinjava.designpattern.template; public class Demo { public static void main(String[] args) { System.out.println(“Going to build Concrete Wall House”); House house = new ConcreteWallHouse(); house.buildhouse(); System.out.println(“Concrete Wall House constructed successfully”); System.out.println(“********************”); System.out.println(“Going to build Glass Wall House”); house = new GlassWallHouse(); house.buildhouse(); System.out.println(“Glass Wall House constructed successfully”); } } ``` 輸出: ```java Going to build Concrete Wall House Base has been constructed. Roof has been constructed. Constructing Concrete Wall for my House Constructing Windows for Concrete Wall House Constructing Doors for Concrete Wall House Painting Concrete Wall House Decorating Concrete Wall House Concrete Wall House constructed successfully ******************** Going to build Glass Wall House Base has been constructed. Roof has been constructed. Constructing Glass Wall for my House Constructing Windows for Glass Wall House Constructing Doors for Glass Wall House Painting Glass Wall House Decorating Glass Wall House Glass Wall House constructed successfully ``` ## 關鍵設計要點 1. **將模板方法標記為最終的**,以便實現類無法覆蓋和更改步驟的順序。 2. **在基類中,使用默認實現**實現所有方法,因此派生類無需定義它們。 3. **標記所有必須抽象實現派生類的方法**。 ## 模板方法模式的流行實現 這些是模板方法設計模式的幾種流行的現有實現。 * [Java IO](//howtodoinjava.com/java-io-tutorial/) 中`InputStream`,`OutputStream`,`Reader`和`Writer`的非抽象方法。 * 一些抽象集合類的非抽象方法,例如`AbstractList`,`AbstractSet`和`AbstractMap`等。 ## 總結 **模板模式**是一種非常簡單的設計模式,用于定義和實現編程示例中的某些順序算法步驟。 它有助于定義算法的框架,該框架不得在子類中被覆蓋。 因此,展望未來,當您需要實現上述業務場景時,請考慮一下模板模式 – 它非常易于實現并且也非常易于維護。 學習愉快! [下載源碼](//howtodoinjava.com/wp-content/downloads/TemplateDesignPattern.zip)
                  <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>

                              哎呀哎呀视频在线观看