对策略模式的一点愚见
在项目恰当的使用策略模式,可以使代码简洁明了,提高扩展性。最常见的使用场景在有多层if-else的逻辑判断中。通过策略模式的替换,让代码更优雅。
一.个简单的例子
这样的写法虽然简单,但也带来了一些问题
1.如果每个分支的业务逻辑比较复杂,就会导致当前方法非常的臃肿
2.给其他开发人员带来了阅读困难(心里吐槽:这谁写的垃圾玩意),提高了维护成本
二.改进措施 策略模式
通过策略模式实现多个用户类型的业务处理
2.1 实现方式
2.1.1.一个抽象的业务接口
2.1.2.具体的业务实现类
2.1.3应用类 : 声明接口的属性,通过构造函数对接口的属性赋值。类中提供执行方法,实现具体策略的调用
2.2 具体代码
2.2.1.一个抽象的业务接口
2.2.2.具体的业务实现类
2.2.3应用类
2.3 测试案例
public class LoginTest {
/**
* 模拟一个用户登录的业务场景
* 不同类型的用户登录会有不同的处理逻辑
* userType : 0 :普通用户; 1:银卡用户; 2:金卡用户 ......
*/
public static void main(String[] args) {
//正式项目中一般使用 @Autowired 注入
commonLogin commonLogin = new commonLogin();
silverLogin silverLogin = new silverLogin();
goldLogin goldLogin = new goldLogin();
LoginContext loginContext = null;
//测试用户
User user1 = new User("001", "0");
//判断用户类型
if ("0".equals(user1.getUserType())){
// TODO 普通用户业务处理逻辑
loginContext = new LoginContext(commonLogin);
}else if ("1".equals(user1.getUserType())){
// TODO 银卡用户业务处理逻辑
loginContext = new LoginContext(silverLogin);
}else if ("2".equals(user1.getUserType())){
// TODO 金卡用户业务处理逻辑
loginContext = new LoginContext(goldLogin);
}
if (loginContext != null){
String executeLgoin = loginContext.executeLgoin(user1.getUserId());
System.out.println(executeLgoin);
}
}
}
2.4 测试结果
2.5 一点小思考
应用类的作用?
简单的来看,如果不使用应用类,直接调用具体的策略方法,功能也能实现。
我的想法是:
1.通过应用类调用实现了业务和策略算法的解耦
2.应用类相当于一个代理类,可以对策略的调用做增强处理
三.总结
通过策略模式的使用,很直观的看出业务方法没有以前那么臃肿。通过应用类调用具体的策略对象。让业务和策略算法实现解耦。
在实际项目中但也不建议看见if-else无脑换策略模式,如果业务本身就很简单,总共也就两三个判断分支 ,也就没必要用策略模式。
以上是我对策略模式的一些愚见,如果文中有什么不妥的地方,还请斧正。