策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,可以替代代码中大量的 if-else。
比如我们生活中的场景:买东西结账可以使用微信支付、支付宝支付或者银行卡支付,这些交易方式就是不同的策略。
那么在什么时候使用策略模式呢?
在《阿里巴巴Java开发手册》中有提到当超过 3 层的 if-else 的逻辑判断代码可以使用策略模式来实现。

在 Spring 中实现策略模式的方式有很多种,下面通过一个案例来演示下,比如有个需求需要实现支持第三方登录,目前需要支持以下三种登录方式:
微信登录
QQ 登录
微博登录
下面将通过策略模式来实现这个需求,其中策略模式结构如下图所示:
策略模式结构如下图所示:

主要包括一个登录接口类和几种登录方式的实现方式,并利用简单工厂来获取对应的处理器。
定义策略接口
首先定义一个登录的策略接口 LoginHandler
,其中包括两个方法:
获取策略类型的方法
处理策略逻辑的方法
public interface LoginHandler<T extends Serializable> {
/**
* 获取登录类型
*
* @return
*/
LoginType getLoginType();
/**
* 登录
*
* @param request
* @return
*/
LoginResponse<String, T> handleLogin(LoginRequest request);
}
其中,LoginHandler
的 getLoginType
方法用来获取登录的类型(即策略类型),用于根据客户端传递的参数直接获取到对应的策略实现。
客户端传递的相关参数都被封装为 LoginRequest,传递给 handleLogin 进行处理。
@Data
public class LoginRequest {
private LoginType loginType;
private Long userId;
}
其中,根据需求定义登录类型枚举如下:
public enum LoginType {
QQ,
WE_CHAT,
WEI_BO;
}
实现策略接口
在定义好策略接口后,我们就需要根据各种第三方登录来实现对应的处理逻辑就可以了。