策略模式配合java8的应用
在用java编写业务代码的过程中,经常会碰到一个业务有不同种的实现。典型的如用户登录,登录入口只有一个,但是要匹配微信、网易、QQ、支付宝、新浪微博等不同的登录渠道。各种业务场景的具体实现又各不相同,有的实现细节业务非常复杂。如果不合理的编码,会导致代码观感很差,影响阅读和维护。今天以这个场景来探讨下策略模式配合java8如何实现优雅编码,代码如下:
1、定义登录请求对象,具体参数不做过多探讨,这里只标识登录的渠道码
public class LogingRequest {
private String loginTypeCode;
/** 其他业务参数 **/
public String getLoginTypeCode() {
return loginTypeCode;
}
public void setLoginTypeCode(String loginTypeCode) {
this.loginTypeCode = loginTypeCode;
}
}
2、一般程序员可能不加思索,按业务逻辑就开始编码,代码应该是这样的
// 普通程序员的写法
public void loginWithIfElse(LogingRequest logingRequest) {
if ("wechat".equals(logingRequest.getLoginTypeCode())) {
// 微信登录的逻辑,
/**
* 一大堆逻辑 $$$$$&^&^&^&%&%&&^&^&^& erwerewrwrewr 2343243242
*/
System.out.println("从微信渠道登录");
} else if ("qq".equals(logingRequest.getLoginTypeCode())) {
// qq登录的逻辑
/**
* 一大堆逻辑 $$$$$&^&^&^&%&%&&^&^&^& erwerewrwrewr 2343243242
*/
System.out.println("从QQ渠道登录");
} else if ("netease".equals(logingRequest.getLoginTypeCode())) {
// 网易登录的逻辑
/**
* 一大堆逻辑 $$$$$&^&^&^&%&%&&^&^&^& erwerewrwrewr 2343243242
*/
System.out.println("从网易渠道登录");
} else if ("sina".equals(logingRequest.getLoginTypeCode())) {
// 新浪微博登录的逻辑
/**
* 一大堆逻辑 $$$$$&^&^&^&%&%&&^&^&^& erwerewrwrewr 2343243242
*/
System.out.println("从新浪微博渠道登录");
} else if ("alipay".equals(logingRequest.getLoginTypeCode())) {
// 支付宝登录的逻辑
/**
* 一大堆逻辑 $$$$$&^&^&^&%&%&&^&^&^& erwerewrwrewr 2343243242
*/
System.out.println("从支付宝渠道登录");
}
}
这样写出来的代码很长,很难看理解,考虑到各登录渠道里还有很复杂的逻辑,也会有很多if+esle,眼睛都会看花,到时候估计不光别人维护你代码会骂娘,你自己看的都一头大。
3、有经验的程序员会抽取一个公共的接口,不同的登录渠道在实现接口后,在自己类中维护和登录逻辑,代码如下
public interface LoginService {
void login(LogingRequest logingRequest);
}
public class WeChatLoginService implements LoginService {
public void login(LogingRequest logingRequest) {
/**一大堆逻辑
* $$$$$&^&^&^&%&%&&^&^&^&
* erwerewrwrewr
* 2343243242
*/
System.out.println("从微信渠道登录"