<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>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 算法的封裝與切換——策略模式(一) 俗話說:條條大路通羅馬。在很多情況下,實現某個目標的途徑不止一條,例如我們在外出旅游時可以選擇多種不同的出行方式,如騎自行車、坐汽車、坐火車或者坐飛機,可根據實際情況(目的地、旅游預算、旅游時間等)來選擇一種最適合的出行方式。在制訂旅行計劃時,如果目的地較遠、時間不多,但不差錢,可以選擇坐飛機去旅游;如果目的地雖遠、但假期長、且需控制旅游成本時可以選擇坐火車或汽車;如果從健康和環保的角度考慮,而且有足夠的毅力,自行車游或者徒步旅游也是個不錯的選擇,大笑。 在軟件開發中,我們也常常會遇到類似的情況,實現某一個功能有多條途徑,每一條途徑對應一種算法,此時我們可以使用一種設計模式來實現靈活地選擇解決途徑,也能夠方便地增加新的解決途徑。本章我們將介紹一種為了適應算法靈活性而產生的設計模式——策略模式。 24.1 電影票打折方案 Sunny軟件公司為某電影院開發了一套影院售票系統,在該系統中需要為不同類型的用戶提供不同的電影票打折方式,具體打折方案如下: (1) 學生憑學生證可享受票價8折優惠; (2) 年齡在10周歲及以下的兒童可享受每張票減免10元的優惠(原始票價需大于等于20元); (3) 影院VIP用戶除享受票價半價優惠外還可進行積分,積分累計到一定額度可換取電影院贈送的獎品。 該系統在將來可能還要根據需要引入新的打折方式。 為了實現上述電影票打折功能,Sunny軟件公司開發人員設計了一個電影票類MovieTicket,其核心代碼片段如下所示: ``` //電影票類 class MovieTicket { private double price; //電影票價格 private String type; //電影票類型 public void setPrice(double price) { this.price = price; } public void setType(String type) { this.type = type; } public double getPrice() { return this.calculate(); } //計算打折之后的票價 public double calculate() { //學生票折后票價計算 if(this.type.equalsIgnoreCase("student")) { System.out.println("學生票:"); return this.price * 0.8; } //兒童票折后票價計算 else if(this.type.equalsIgnoreCase("children") && this.price >= 20 ) { System.out.println("兒童票:"); return this.price - 10; } //VIP票折后票價計算 else if(this.type.equalsIgnoreCase("vip")) { System.out.println("VIP票:"); System.out.println("增加積分!"); return this.price * 0.5; } else { return this.price; //如果不滿足任何打折要求,則返回原始票價 } } } ``` 編寫如下客戶端測試代碼: ``` class Client { public static void main(String args[]) { MovieTicket mt = new MovieTicket(); double originalPrice = 60.0; //原始票價 double currentPrice; //折后價 mt.setPrice(originalPrice); System.out.println("原始價為:" + originalPrice); System.out.println("---------------------------------"); mt.setType("student"); //學生票 currentPrice = mt.getPrice(); System.out.println("折后價為:" + currentPrice); System.out.println("---------------------------------"); mt.setType("children"); //兒童票 currentPrice = mt.getPrice(); System.out.println("折后價為:" + currentPrice); } } ``` 編譯并運行程序,輸出結果如下所示: ``` 原始價為:60.0 --------------------------------- 學生票: 折后價為:48.0 --------------------------------- 兒童票: 折后價為:50.0 ``` 通過MovieTicket類實現了電影票的折后價計算,該方案解決了電影票打折問題,每一種打折方式都可以稱為一種打折算法,更換打折方式只需修改客戶端代碼中的參數,無須修改已有源代碼,但該方案并不是一個完美的解決方案,它至少存在如下三個問題: (1) MovieTicket類的calculate()方法非常龐大,它包含各種打折算法的實現代碼,在代碼中出現了較長的if…else…語句,不利于測試和維護。 (2) 增加新的打折算法或者對原有打折算法進行修改時必須修改MovieTicket類的源代碼,違反了“開閉原則”,系統的靈活性和可擴展性較差。 (3) 算法的復用性差,如果在另一個系統(如商場銷售管理系統)中需要重用某些打折算法,只能通過對源代碼進行復制粘貼來重用,無法單獨重用其中的某個或某些算法(重用較為麻煩)。 如何解決這三個問題?導致產生這些問題的主要原因在于MovieTicket類職責過重,它將各種打折算法都定義在一個類中,這既不便于算法的重用,也不便于算法的擴展。因此我們需要對MovieTicket類進行重構,將原本龐大的MovieTicket類的職責進行分解,將算法的定義和使用分離,這就是策略模式所要解決的問題,下面將進入策略模式的學習。
                  <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>

                              哎呀哎呀视频在线观看