Acwing 799. 最長連續不重複子序列(雙指標)
阿新 • • 發佈:2020-11-13
一、簡介
策略(Strategy)模式的定義:該模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的變化不會影響使用演算法的客戶。策略模式屬於物件行為模式,它通過對演算法進行封裝,把使用演算法的責任和演算法的實現分割開來,並委派給不同的物件對這些演算法進行管理。
二、優缺點
優點:
- 多重條件語句不易維護,而使用策略模式可以避免使用多重條件語句,如 if…else 語句、switch…case 語句。
- 策略模式提供了一系列的可供重用的演算法族,恰當使用繼承可以把演算法族的公共程式碼轉移到父類裡面,從而避免重複的程式碼。
- 策略模式可以提供相同行為的不同實現,客戶可以根據不同時間或空間要求選擇不同的。
- 策略模式提供了對開閉原則的完美支援,可以在不修改原始碼的情況下,靈活增加新演算法。
- 策略模式把演算法的使用放到環境類中,而演算法的實現移到具體策略類中,實現了二者的分離。
缺點:
- 客戶端必須理解所有策略演算法的區別,以便適時選擇恰當的演算法類。
- 策略模式造成很多的策略類,增加維護難度。
三、應用場景
1) 一個系統需要動態地在幾種演算法中選擇一種時,可將每個演算法封裝到策略類中。
2) 一個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現,可將每個條件分支移入它們各自的策略類中以代替這些條件語句。
3) 系統中各演算法彼此完全獨立,且要求對客戶隱藏具體演算法的實現細節時。
4) 系統要求使用演算法的客戶不應該知道其操作的資料時,可使用策略模式來隱藏與演算法相關的資料結構。
5) 多個類只區別在表現行為不同,可以使用策略模式,在執行時動態選擇具體要執行的行為。
四、模式結構
1. 主要角色
- 抽象策略(Strategy)類:定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面,環境角色使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。
- 具體策略(Concrete Strategy)類:實現了抽象策略定義的介面,提供具體的演算法實現。
- 環境(Context)類:持有一個策略類的引用,最終給客戶端呼叫。
2. UML類圖
五、程式碼實現
- 抽象策略類
public interface Strategy {
/**
* 優惠策略方法
* @param money
* @return
*/
double discount(double money);
}
- 具體策略類
public class DiscountStrategyOne implements Strategy {
/**
* 優惠策略一:打五折
* @param money
* @return
*/
@Override
public double discount(double money) {
return money / 2;
}
}
public class DiscountStrategyTwo implements Strategy {
/**
* 優惠策略二:滿300減100
* @param money
* @return
*/
@Override
public double discount(double money) {
return money - (int) (money / 300) * 100;
}
}
- 環境類
public class StrategyContext {
private Strategy strategy;
public StrategyContext(int type) {
switch (type){
case 1:
strategy = new DiscountStrategyOne();
break;
case 2:
strategy = new DiscountStrategyTwo();
break;
}
}
public double pay(double money){
return strategy.discount(money);
}
}
- 測試
@Test
void test() {
double money = 1000;
StrategyContext strategyContext1 = new StrategyContext(1);
System.out.println(strategyContext1.pay(money));
StrategyContext strategyContext2 = new StrategyContext(2);
System.out.println(strategyContext2.pay(money));
}