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

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表达式就不在此叙述了。

以上就是我对策略模式的一些理解,有不足之处请你们指出,谢谢。

相关文章
相关标签/搜索