【大道模式】策略模式-Strategy Pattern

     當你的代碼中出現大量的if else的時候,是時候考慮一下策略模式了。

基本介紹:

1)策略模式中,定義算法族,分別封裝起來,讓他們之間可以相互替換,此模式讓算法的變化獨立於使用算法的客戶。

2)這算法體現了幾個設計原則:

第一、把變化的代碼從不變的代碼中分離出來;

第二、針對接口編程而不是具體類(定義了策略接口);

第三、多用組合/聚合,少用繼承(客戶通過組合方式使用策略)

動機(Motivation):

>在軟件構建過程中,某些對象使用的算法可能多種多樣,經常改變,如果將這些算法都編碼到兌現各種中,將會使得對象變得異常複雜,有時候支持不使用的算法也是一種性能負擔(大量的ifelse判斷)。

>在運行時根據需要透明地更改對象的算法,將算法與對象本身解耦,從而避免上述問題。

核心組件

+Strategy:策略接口;

+Context:封裝策略接口的類;

+***Strategy:策略實現類;

下面假設一種場景,即我們在每個國家都買東西的時候都需要繳稅,而每個多家的稅率都是不一樣的,如果按照傳統的方式我們可以會這麼做:

定義TaxEnum枚舉類:

public enum TaxEnum {

    CN_TAX,
    JP_TAX,
    US_TAX
}

定義TaxPrice類:

public class TaxPrice {

    public double calTax(double basePrice, TaxEnum taxEnum) {

        if (taxEnum == TaxEnum.CN_TAX) {
            //do sth
            return basePrice * 0.9;
        } else if (taxEnum == TaxEnum.JP_TAX) {
            //do sth
            return basePrice * 0.8;
        } else if (taxEnum == TaxEnum.US_TAX) {
            //do sth
            return basePrice * 0.7;
        }
        //未來如果需要支持法國,德國怎麼辦?在enum中天健枚舉類型,然後再在代碼中添加if else。
        //這麼做違反了原則:開閉原則,對擴展開放,對修改關閉。
      
        return basePrice;
    }
}

Client:

public class Client {

    public static void main(String[] args) {
        TaxPrice payOrder = new TaxPrice();
        System.out.println(payOrder.calTax(100, TaxEnum.US_TAX));
        System.out.println(payOrder.calTax(100, TaxEnum.CN_TAX));
        System.out.println(payOrder.calTax(100, TaxEnum.JP_TAX));
    }
}

那麼問題來了,未來如果需要支持法國,德國怎麼辦?在enum中天健枚舉類型,然後再在代碼中添加if else。 //這麼做違反了原則:開閉原則,對擴展開放,對修改關閉。因此我們可以使用策略模式來進行重構。

定義TaxStrategy接口:

public interface TaxStrategy {

    double calTax(double basePrice);
}

創建具體策略實現類:

public class CNTaxStrategy implements TaxStrategy {

    public double calTax(double basePrice) {
        return basePrice * 0.9;
    }
}
public class JPTaxStrategy implements TaxStrategy {

    public double calTax(double basePrice) {
        return basePrice * 0.8;
    }
}
public class USTaxStrategy implements TaxStrategy {
    public double calTax(double basePrice) {
        return basePrice * 0.7;
    }
}

創建Client客戶端:

public class Client {

    public static void main(String[] args) {
        TaxContext context = new TaxContext(new CNTaxStrategy());
        System.out.println(context.executeStrategy(100));
        context = new TaxContext(new JPTaxStrategy());
        System.out.println(context.executeStrategy(100));
        context = new TaxContext(new USTaxStrategy());
        System.out.println(context.executeStrategy(100));
    }
}

運行結果:

90.0
80.0
70.0

 

Author:憶之獨秀

Email:[email protected]

註明出處:https://lavorange.blog.csdn.net/article/details/106459605

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章