Ubuntu 18.04 LTS如何設定固定IP
阿新 • • 發佈:2020-12-11
設計模式
本系列文章均是博主原創,意在記錄學習上的知識,同時一起分享學習心得。文章目錄
前言
- List item
本章節介紹策略模式的原理和實現,以及應用場景和真正的設計意圖。
一、原理和實現
- 策略模式的定義
定義一族演算法類,將每個演算法分別封裝起來,讓它們可以互相替換。策略模式可以使演算法的變化獨立於使用它們的客戶端。
一個完整的策略模式應該包含的三部分:
- 策略的定義
- 策略的建立
- 策略的使用
1.1 策略的定義
策略類的定義比較簡單,包含一個策略介面和一組實現這個介面的策略類。因為所有的策略類都實現相同的介面,所以,客戶端程式碼基於介面而非實現程式設計,可以靈活地替換不同的策略。
程式碼如下(示例):
public interface Strategy {
void calculate();
}
public class CalculateStrategyA implements Strategy {
@Override
public void calculate() {
System.out.println("A計算公式");
}
}
public class CalculateStrategyB implements Strategy {
@Override
public void calculate() {
System.out.println("B計算公式");
}
}
1.2 策略的建立
因為策略模式會包含一組策略,在使用它們的時候,一般會通過型別來判斷建立哪個策略來使用。為了封裝建立邏輯,我們需要對客戶端程式碼遮蔽建立細節。我們可以把根據type建立的邏輯抽離出來,放在工廠類中。
程式碼如下(示例):
public class StrategyFactory {
private static final Map<String, Strategy> strategies = new HashMap <>();
static {
strategies.put("A", new CalculateStrategyA());
strategies.put("B", new CalculateStrategyB());
}
public static Strategy getStrategy(String type) {
if (type == null || type.isEmpty()) {
throw new IllegalArgumentException("type should not be empty");
}
return strategies.get(type);
}
}
1.3 策略的使用
策略模式在使用的過程中,有執行時動態選擇或者在程式碼裡指定使用哪種策略,一般的應用場景都是執行時動態選擇策略,通過模擬場景來達到動態選擇的過程。
程式碼如下(示例):
@Test
public void test() {
Random random = new Random();
int num = random.nextInt(10);
String type = "A";
if (num >= 5) {
type = "B";
}
Strategy strategy = StrategyFactory.getStrategy(type);
strategy.calculate();
}
二、應用場景
策略模式適用於根據不同型別待動態,決定使用哪種策略這樣一種應用場景。
我們可以通過策略模式來移除if-else分支判斷。實際上,這得益於策略工廠類,更本質上講,是藉助查表法type查表替代根據type分支判斷。
- 應用場景一舉例
比如有一個超市在搞活動,購買金額小於50元,折扣為9.8;購買金額大於等於50元,且小於200元,折扣為9.5;購買金額大於等於200小於500,折扣為9折;大於500統一折扣為8折;
為了實現這麼一個折扣計算功能,程式碼需要寫4個if-else,如果需求再增多一個規則,程式碼還需重構if-else,這樣在可維護性、可讀性大大降低,而且修改容易出bug。
如果運用策略模式,每個規則對應一個策略,根據金額大小對應選擇哪一種策略,這樣整體程式碼邏輯清晰,而且不管新增或修改規則時,只需要新增或調整對應的規則策略,這樣大大降低bug的風險,可維護性更高。
總結
策略模式主要的作用還是解耦策略的定義、建立和使用,控制程式碼的複雜度,讓每個部分都不至於過於複雜、程式碼量過多。除此之外,對應複雜程式碼來說,策略模式還能讓其滿足開閉原則,新增新策略的時候,最小化、集中化程式碼改動,減少引入bug的風險。