策略模式,定义了一组算法,将每一个算法都封装起来,而且使它们之间能够互换。 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表达式就不在此叙述了。
以上就是我对策略模式的一些理解,有不足之处请你们指出,谢谢。