【設計模式】Strategy 策略模式

策略模式是什麼?
策略是對算法的封裝,是一種形爲模式,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。

爲什麼要用?
優點:
1.擴展性良好;
2.避免使用多重條件判斷,遵循開閉原則;
3.算法可以自由切換。
缺點:
1.所有策略類都需要對外暴露;
2.策略類會增多。

怎麼用?
策略模式有以下幾個概念:
Strategy接口:定義每個策略或算法必須具有的方法和屬性。
ConcreteStrategy類:具體策略的實現;
Context類:上下文角色,有承上啓下封裝作用,負責和具體的策略實現交互。

下邊直接上測試代碼:

/**
 * @Description 定義抽象的策略角色
 * @date 2019/10/21 11:38
 * @Version V1.0
 */
public interface StrategyTest {
    /**
     * 定義兩個數可以計算,實現簡單的加減乘除的功能
     */
    int calc(int num1, int num2);
}
public class AddStrategyTest implements StrategyTest {
    /**
     * 實現calc方法,完成兩個數相加
     */
    @Override
    public int calc(int num1, int num2) {
        return num1 + num2;
    }
}
public class SubtractStrategyTest implements StrategyTest {
    /**
     * 實現calc方法,完成兩個數相減
     */
    @Override
    public int calc(int num1, int num2) {
        return num1 - num2;
    }
}
public class Context {
    // 持有對策略類的引用
    private StrategyTest strategyTest;
    
    public Context(StrategyTest strategyTest) {
        this.strategyTest = strategyTest;
    }
      public int calulate(int a, int b){
        return strategyTest.calc(a, b);
    }
}
@Test
public void strategyTest(){
    Context context = new Context(new AddStrategyTest());
    int calulate = context.calulate(20, 30);
    Context context1 = new Context(new SubtractStrategyTest());
    int calulate1 = context1.calulate(30, 20);
    System.out.println("----------------測試加法" + calulate + "--------------");
    System.out.println("----------------測試減法" + calulate1 + "--------------");
}

在這裏插入圖片描述
由上述結果可知,由於實例化不同的策略,所以最終在調用context.calulate();時,所獲得的的結果就不盡相同。
策略模式是一種定義一些列算法的方法,從概念上來看,所有這些算法完成的都是相同的工作,只是實現不同,它可以以相同的方法調用所有的算法,減少了各種算法類與使用算法類之間的耦合。

在基本的策略模式中,選擇所用具體實現的職責由客戶端對象承擔,並轉給策略模式的Context對象。這本身並沒有解除客戶端需要選擇判斷的壓力,可以將策略模式和簡單工廠模式結合,選擇具體來實現的職責就可以給Context來承擔,最大化地減輕了客戶端的職責。

策略模式和簡單工廠模式的區別:
簡單工廠模式:只需要發出命令,由他人去實現。
策略模式:不知要發出命令,還得由自己親自去做。
兩個的區別非常微妙,Factory是直接創建詳細的對象並用該對象去運行對應的動作,而Strategy將這個操作給了Context類。沒有創建詳細的對象,實現的代碼的進一步封裝。

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