Java常用設計模式——策略模式

來源:互聯網
上載者:User

標籤:折扣   string   的區別   會員   over   而且   繼承   @param   oid   

     策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換,策略模式讓演算法獨立於使用它的客戶而獨立變化。策略模式使這些演算法在用戶端調用它們的時候能夠互不影響地變化,它是一種行為型模式

策略模式中有三個對象:

  • 環境對象(Context):該類中實現了對抽象策略中定義的介面或者抽象類別的引用。
  • 抽象策略對象(Strategy):它可由介面或抽象類別來實現。
  • 具體策略對象(ConcreteStrategy):它封裝了實現同不功能的不同演算法

    定義抽象策略對象

package com.strategypattern;/** * @author yyx 2017年10月11日 * 策略介面 */public interface DiscountStrategy {    /**     * 計算價格     *      * @param commodityPrice     * @return     */    public double discountPrice(double commodityPrice);}

     定義具體策略對象

package com.strategypattern;/** * @author yyx 2017年10月11日 */public class IsMemberDiscountStrategy implements DiscountStrategy {    @Override    public double discountPrice(double commodityPrice) {        System.out.println("對於會員的折扣為10%");        return commodityPrice * 0.9;    }}package com.strategypattern;/** * @author yyx 2017年10月11日 */public class NotMemberDiscountStrategy implements DiscountStrategy {    @Override    public double discountPrice(double commodityPrice) {        System.out.println("對於非會員沒有折扣");        return commodityPrice;    }}

    定義環境對象

package com.strategypattern;/** * @author yyx 2017年10月11日 */public class CalculatedPrice {    private DiscountStrategy discountStrategy;    public CalculatedPrice(DiscountStrategy discountStrategy) {        super();        this.discountStrategy = discountStrategy;    }    public void quote(double commodityPrice) {        System.out.println("您的折扣價為:"                + this.discountStrategy.discountPrice(commodityPrice));    }}

     定義測試類別

package com.strategypattern;/** * @author yyx 2017年10月11日 */public class PatternTest {    public static void main(String[] args) {        // 選擇並建立需要使用的策略對象        DiscountStrategy discountStrategy = new IsMemberDiscountStrategy();        // 建立環境        CalculatedPrice calculatedPrice = new CalculatedPrice(discountStrategy);        // 計算價格        calculatedPrice.quote(300);    }}

策略模式的優點

  (1)策略模式提供了管理相關的演算法族的辦法。策略類的等級結構定義了一個演算法或行為族。恰當使用繼承可以把公用的代碼移到父類裡面,從而避免代碼重複

  (2)使用原則模式可以避免使用多重條件(if-else)語句。多重條件陳述式不易維護,它把採取哪一種演算法或採取哪一種行為的邏輯與演算法或行為的邏輯混合在一起,統統列在一個多重條件陳述式裡面,比使用繼承的辦法還要原始和落後

策略模式的缺點

  (1)用戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著用戶端必須理解這些演算法的區別,以便適時選擇恰當的演算法類。換言之,策略模式只適用於用戶端知道演算法或行為的情況

  (2)由於策略模式把每個具體的策略實現都單獨封裝成為類,如果備選的策略很多的話,那麼對象的數目就會很可觀

Java常用設計模式——策略模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.