1. 程式人生 > >大話設計模式--策略模式

大話設計模式--策略模式

策略模式(Strategy):定義了演算法家族,分別封裝起來,讓各個演算法之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。


/**
* 策略,定義計算報價演算法的介面
* */
public interface Strategy {
    /**
     * 計算應該報的價格
     * @param goodPrice 商品銷售原價
     * @return 計算出來的,應該給客戶的價格
     *
     */

    public double calcPrice(double goodPrice);

}


之後定義不同的具體實現演算法

public class NormalCustomerStrategy implements Strategy {

    @Override
    public double calcPrice(double goodPrice) {
        System.out.println("對於新客戶或者是普通使用者,沒有折扣");
        return goodPrice;
    }
}

public class OldCustomerStrategy implements Strategy{

    @Override
    public double calcPrice(double goodPrice) {
        /**
         * 具體演算法實現,為老客戶計算應報的價格
         */
        System.out.println("對於老客戶,統一折扣5%");

        return (goodPrice * (1 - 0.05));
    }
}

public class LargerCustomerStrategy implements Strategy {

    public double calcPrice(double goodsPrice) {

        System.out.println("對於大客戶,統一折扣10%");

        return goodsPrice*(1-0.1);

    }

}

public class Price {

    /**
     *
     * 持續一個具體的策略物件
     */

    private Strategy strategy = null;

    public Price(Strategy astrategy) {
        this.strategy = astrategy;
    }

    public double qoute(double goodPrice) {
        return this.strategy.calcPrice(goodPrice);
    }
}


策略模式是一種定義一系列演算法的方法,從概念上看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。

同時策略模式的Strategy類層次為Context定義了一系列的可重用的的演算法或行為,繼承有助於析取出演算法中的公共功能。

另外一個策略模式的優點是簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試