1. 程式人生 > >Java常用設計模式——策略模式

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

nts static 管理 選擇 span disco rri contex 由於

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

策略模式中有三個對象

  • 環境對象(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常用設計模式——策略模式