1. 程式人生 > 實用技巧 >Acwing 799. 最長連續不重複子序列(雙指標)

Acwing 799. 最長連續不重複子序列(雙指標)

技術標籤:設計模式設計模式

一、簡介

策略(Strategy)模式的定義:該模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的變化不會影響使用演算法的客戶。策略模式屬於物件行為模式,它通過對演算法進行封裝,把使用演算法的責任和演算法的實現分割開來,並委派給不同的物件對這些演算法進行管理。

二、優缺點

優點:

  • 多重條件語句不易維護,而使用策略模式可以避免使用多重條件語句,如 if…else 語句、switch…case 語句。
  • 策略模式提供了一系列的可供重用的演算法族,恰當使用繼承可以把演算法族的公共程式碼轉移到父類裡面,從而避免重複的程式碼。
  • 策略模式可以提供相同行為的不同實現,客戶可以根據不同時間或空間要求選擇不同的。
  • 策略模式提供了對開閉原則的完美支援,可以在不修改原始碼的情況下,靈活增加新演算法。
  • 策略模式把演算法的使用放到環境類中,而演算法的實現移到具體策略類中,實現了二者的分離。

缺點:

  • 客戶端必須理解所有策略演算法的區別,以便適時選擇恰當的演算法類。
  • 策略模式造成很多的策略類,增加維護難度。

三、應用場景

1) 一個系統需要動態地在幾種演算法中選擇一種時,可將每個演算法封裝到策略類中。

2) 一個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現,可將每個條件分支移入它們各自的策略類中以代替這些條件語句。

3) 系統中各演算法彼此完全獨立,且要求對客戶隱藏具體演算法的實現細節時。

4) 系統要求使用演算法的客戶不應該知道其操作的資料時,可使用策略模式來隱藏與演算法相關的資料結構。

5) 多個類只區別在表現行為不同,可以使用策略模式,在執行時動態選擇具體要執行的行為。

四、模式結構

1. 主要角色

  • 抽象策略(Strategy)類:定義了一個公共介面,各種不同的演算法以不同的方式實現這個介面,環境角色使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。
  • 具體策略(Concrete Strategy)類:實現了抽象策略定義的介面,提供具體的演算法實現。
  • 環境(Context)類:持有一個策略類的引用,最終給客戶端呼叫。

2. UML類圖

在這裡插入圖片描述

五、程式碼實現

  1. 抽象策略類
public
interface Strategy { /** * 優惠策略方法 * @param money * @return */ double discount(double money); }
  1. 具體策略類
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;
    }
}
  1. 環境類
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);
    }
}
  1. 測試
@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));
    }