《一天一模式》— 策略模式

1、策略模式的概念

策略模式,定義了一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換。 java

 2、何時使用策略模式

簡單來講,在某個業務場景下須要根據環境選擇不一樣的算法(業務,大約一種),那麼就可使用策略模式來實現,基本上使用策略模式的場景有:算法

  • 系統中某個業務有多種實現,根據場景選擇業務;
  • 系統中某個算法有多種實現,根據場景選擇算法;

舉個例子:微信

  • 用戶登陸時,要求驗證方式有賬號密碼驗證、手機號PIN號驗證、微信登陸驗證等,能夠把這三種驗證方式作成三個策略,根據用戶選擇的登陸方式來執行具體的某個策略;
  • 作數據加簽時,對端系統有的要求是MD5加密,有的要求是RSA加密,這時能夠把加密算法作成策略,根據系統的不一樣選擇某個策略;

3、怎麼使用策略模式

3.1 不使用策略模式的弊端

以上面登陸的例子來講,不使用策略模式,可能要在代碼中寫if...else,或者switch...case來完成業務場景,這種寫法有幾種弊端,看下面的僞代碼:函數

public login(String type) {
    if(type.equals("密碼") {
        ....
    } else if (type.equals("PIN碼") {
        ....
    } else {
        // 微信登陸
        ....
    }
}
  • 可讀性差,當須要判斷的分支過多時,代碼的可讀性就會下降,也不便於後期維護;
  • 擴展性差,當有新的需求到來,須要修改這個if...else的判斷分支,違反了開閉原則;

3.2 使用策略模式解決問題

策略模式的概念說,要咱們定義一組算法,也就是說從業務角度抽象,把登陸作成一組算法,下面看下如何用Java來編寫策略模式。優化

代碼以下:加密

// 登陸策略
public interface LoginStrategy {

    void login();

}

// 密碼登陸
public class PasswordLoginStrategy implements LoginStrategy {
    public void login() {
        System.out.println("密碼登陸");
    }
}

// PIN碼登陸
public class PinCodeLoginStrategy  implements LoginStrategy {
    public void login() {
        System.out.println("PIN碼登陸");
    }
}

// 微信登陸
public class WeChatLoginStrategy  implements LoginStrategy {
    public void login() {
        System.out.println("微信登陸");
    }
}

// 使用策略模式
public class Client {

    public static void main(String[] args) {
        // 登陸時候選擇策略
        login("Superman", new WeChatLoginStrategy());

        System.out.println();

        // 登陸時選擇策略
        login("Tom", new PinCodeLoginStrategy());

    }

    static void login(String account, LoginStrategy loginStrategy) {
        System.out.println(account + "登陸,登陸方式以下:");
        loginStrategy.login();
    }

}

// 輸出以下結果
Superman登陸,登陸方式以下:
微信登陸

Tom登陸,登陸方式以下:
PIN碼登陸

4、總結

策略模式的用法和作法很簡單,從技術角度來講是多態的一種應用。spa

想要用好策略模式,須要將業務理解透徹,判斷哪些業務能夠同質化的抽象成一組策略,而且要對業務有必定的前瞻性考慮,哪些業務有可能在後續的需求變動加入到系統中。相比於技術實現來講,這個纔是重點。code

策略模式的好處有:接口

  • 可讀性高:優化了if...else結構,經過良好的命名,能夠語義化的讀出業務工做;
  • 擴展性強:當有新的算法(業務)加入到系統中,只須要實現策略接口,編寫新的策略便可,無需對老代碼進行修改,符合開閉原則;

另外,Java8加入了Lambda表達式,咱們能夠將接口用@FunctionalInterface進行修飾,將它定義成函數式接口,會簡化上面的策略模式寫法。it

具體如何使用Lambda表達式就不在此敘述了。

以上就是我對策略模式的一些理解,有不足之處請你們指出,謝謝。

相關文章
相關標籤/搜索