標籤:折扣 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常用設計模式——策略模式