<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國際加速解決方案。 廣告
                # 復雜對象的組裝與創建——建造者模式(三) 8.4 關于Director的進一步討論 指揮者類Director在建造者模式中扮演非常重要的作用,簡單的Director類用于指導具體建造者如何構建產品,它按一定次序調用Builder的buildPartX()方法,控制調用的先后次序,并向客戶端返回一個完整的產品對象。下面我們討論幾種Director的高級應用方式: 1.省略Director 在有些情況下,為了簡化系統結構,可以將Director和抽象建造者Builder進行合并,在Builder中提供逐步構建復雜產品對象的construct()方法。由于Builder類通常為抽象類,因此可以將construct()方法定義為靜態(static)方法。如果將游戲角色設計中的指揮者類ActorController省略,ActorBuilder類的代碼修改如下: ``` abstract class ActorBuilder { protected static Actor actor = new Actor(); public abstract void buildType(); public abstract void buildSex(); public abstract void buildFace(); public abstract void buildCostume(); public abstract void buildHairstyle(); public static Actor construct(ActorBuilder ab) { ab.buildType(); ab.buildSex(); ab.buildFace(); ab.buildCostume(); ab.buildHairstyle(); return actor; } } ``` 對應的客戶端代碼也將發生修改,其代碼片段如下所示: ``` …… ActorBuilder ab; ab = (ActorBuilder)XMLUtil.getBean(); Actor actor; actor = ActorBuilder.construct(ab); …… ``` 除此之外,還有一種更簡單的處理方法,可以將construct()方法的參數去掉,直接在construct()方法中調用buildPartX()方法,代碼如下所示: ``` abstract class ActorBuilder { protected Actor actor = new Actor(); public abstract void buildType(); public abstract void buildSex(); public abstract void buildFace(); public abstract void buildCostume(); public abstract void buildHairstyle(); public Actor construct() { this.buildType(); this.buildSex(); this.buildFace(); this.buildCostume(); this.buildHairstyle(); return actor; } } ``` 客戶端代碼代碼片段如下所示: ``` …… ActorBuilder ab; ab = (ActorBuilder)XMLUtil.getBean(); Actor actor; actor = ab.construct(); …… ``` 此時,construct()方法定義了其他buildPartX()方法調用的次序,為其他方法的執行提供了一個流程模板,這與我們在后面要學習的模板方法模式非常類似。 以上兩種對Director類的省略方式都不影響系統的靈活性和可擴展性,同時還簡化了系統結構,但加重了抽象建造者類的職責,如果construct()方法較為復雜,待構建產品的組成部分較多,建議還是將construct()方法單獨封裝在Director中,這樣做更符合“單一職責原則”。 2.鉤子方法的引入 建造者模式除了逐步構建一個復雜產品對象外,還可以通過Director類來更加精細地控制產品的創建過程,例如增加一類稱之為鉤子方法(HookMethod)的特殊方法來控制是否對某個buildPartX()的調用。 鉤子方法的返回類型通常為boolean類型,方法名一般為isXXX(),鉤子方法定義在抽象建造者類中。例如我們可以在游戲角色的抽象建造者類ActorBuilder中定義一個方法isBareheaded(),用于判斷某個角色是否為“光頭(Bareheaded)”,在ActorBuilder為之提供一個默認實現,其返回值為false,代碼如下所示: ``` abstract class ActorBuilder { protected Actor actor = new Actor(); public abstract void buildType(); public abstract void buildSex(); public abstract void buildFace(); public abstract void buildCostume(); public abstract void buildHairstyle(); //鉤子方法 public boolean isBareheaded() { return false; } public Actor createActor() { return actor; } } ``` 如果某個角色無須構建頭發部件,例如“惡魔(Devil)”,則對應的具體建造器DevilBuilder將覆蓋isBareheaded()方法,并將返回值改為true,代碼如下所示: ``` class DevilBuilder extends ActorBuilder { public void buildType() { actor.setType("惡魔"); } public void buildSex() { actor.setSex("妖"); } public void buildFace() { actor.setFace("丑陋"); } public void buildCostume() { actor.setCostume("黑衣"); } public void buildHairstyle() { actor.setHairstyle("光頭"); } //覆蓋鉤子方法 public boolean isBareheaded() { return true; } } ``` 此時,指揮者類ActorController的代碼修改如下: ``` class ActorController { public Actor construct(ActorBuilder ab) { Actor actor; ab.buildType(); ab.buildSex(); ab.buildFace(); ab.buildCostume(); //通過鉤子方法來控制產品的構建 if(!ab.isBareheaded()) { ab. buildHairstyle(); } actor=ab.createActor(); return actor; } } ``` 當在客戶端代碼中指定具體建造者類型并通過指揮者來實現產品的逐步構建時,將調用鉤子方法isBareheaded()來判斷游戲角色是否有頭發,如果isBareheaded()方法返回true,即沒有頭發,則跳過構建發型的方法buildHairstyle();否則將執行buildHairstyle()方法。通過引入鉤子方法,我們可以在Director中對復雜產品的構建進行精細的控制,不僅指定buildPartX()方法的執行順序,還可以控制是否需要執行某個buildPartX()方法。 8.5 建造者模式總結 建造者模式的核心在于如何一步步構建一個包含多個組成部件的完整對象,使用相同的構建過程構建不同的產品,在軟件開發中,如果我們需要創建復雜對象并希望系統具備很好的靈活性和可擴展性可以考慮使用建造者模式。 1.主要優點 建造者模式的主要優點如下: (1) 在建造者模式中,客戶端不必知道產品內部組成的細節,將產品本身與產品的創建過程解耦,使得相同的創建過程可以創建不同的產品對象。 (2) 每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產品對象。由于指揮者類針對抽象建造者編程,增加新的具體建造者無須修改原有類庫的代碼,系統擴展方便,符合“開閉原則” (3) 可以更加精細地控制產品的創建過程。將復雜產品的創建步驟分解在不同的方法中,使得創建過程更加清晰,也更方便使用程序來控制創建過程。 2.主要缺點 建造者模式的主要缺點如下: (1) 建造者模式所創建的產品一般具有較多的共同點,其組成部分相似,如果產品之間的差異性很大,例如很多組成部分都不相同,不適合使用建造者模式,因此其使用范圍受到一定的限制。 (2) 如果產品的內部變化復雜,可能會導致需要定義很多具體建造者類來實現這種變化,導致系統變得很龐大,增加系統的理解難度和運行成本。 3.適用場景 在以下情況下可以考慮使用建造者模式: (1) 需要生成的產品對象有復雜的內部結構,這些產品對象通常包含多個成員屬性。 (2) 需要生成的產品對象的屬性相互依賴,需要指定其生成順序。 (3) 對象的創建過程獨立于創建該對象的類。在建造者模式中通過引入了指揮者類,將創建過程封裝在指揮者類中,而不在建造者類和客戶類中。 (4) 隔離復雜對象的創建和使用,并使得相同的創建過程可以創建不同的產品。 練習 > Sunny軟件公司欲開發一個視頻播放軟件,為了給用戶使用提供方便,該播放軟件提供多種界面顯示模式,如完整模式、精簡模式、記憶模式、網絡模式等。在不同的顯示模式下主界面的組成元素有所差異,如在完整模式下將顯示菜單、播放列表、主窗口、控制條等,在精簡模式下只顯示主窗口和控制條,而在記憶模式下將顯示主窗口、控制條、收藏列表等。嘗試使用建造者模式設計該軟件。
                  <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>

                              哎呀哎呀视频在线观看