當你的代碼中出現大量的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