策略模式,定義了一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換。 java
簡單來講,在某個業務場景下須要根據環境選擇不一樣的算法(業務,大約一種),那麼就可使用策略模式來實現,基本上使用策略模式的場景有:算法
舉個例子:微信
以上面登陸的例子來講,不使用策略模式,可能要在代碼中寫if...else,或者switch...case來完成業務場景,這種寫法有幾種弊端,看下面的僞代碼:函數
public login(String type) { if(type.equals("密碼") { .... } else if (type.equals("PIN碼") { .... } else { // 微信登陸 .... } }
策略模式的概念說,要咱們定義一組算法,也就是說從業務角度抽象,把登陸作成一組算法,下面看下如何用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碼登陸
策略模式的用法和作法很簡單,從技術角度來講是多態的一種應用。spa
想要用好策略模式,須要將業務理解透徹,判斷哪些業務能夠同質化的抽象成一組策略,而且要對業務有必定的前瞻性考慮,哪些業務有可能在後續的需求變動加入到系統中。相比於技術實現來講,這個纔是重點。code
策略模式的好處有:接口
另外,Java8加入了Lambda表達式,咱們能夠將接口用@FunctionalInterface進行修飾,將它定義成函數式接口,會簡化上面的策略模式寫法。it
具體如何使用Lambda表達式就不在此敘述了。
以上就是我對策略模式的一些理解,有不足之處請你們指出,謝謝。