原文来源于:程序员恰恰
如有侵权,联系删除
代码中的if/ else/ switch太多,代码会显得很臃肿,后期维护难度也大,本文教你如何用策略模式干掉 if/ else/ switch,让你的代码看起来更优雅。
什么是策略模式?
比如说对象的某个行为,在不同场景中有不同的实现方式,这样就可以将这些实现方式定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。
策略模式结构图如下:
举个例子:
出行旅游:我们可以有几个策略可以考虑:可以骑自行车,汽车,做火车,飞机。每个策略都可以得到相同的结果,但是它们使用了不同的资源。选择策略的依据是费用,时间,使用工具还有每种方式的方便程度 。
1、定义策略接口
定义一个策略接口,所有出行方式的接口。
策略接口:
package com.it001.startegy;
/**
* author:公众号:java狂神
* Date:2021/5/22
* Time:1:40 下午
*/
public interface TravelStrategy {
Result travel(String travelType);
}
返回结果类:
package com.it001.startegy;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* author:公众号:java狂神
* Date:2021/5/22
* Time:1:41 下午
*/
@Data
@AllArgsConstructor
public class Result {
private String traveType;
}
2、定义各种策略
定义各种出行策略,坐飞机、骑自行车、乘坐火车等出行方式实现类都实现这个接口。
坐飞机实现:
/**
* author:公众号:java狂神
* Date:2021/5/22
* Time:1:42 下午
*/
@Service("AirPlane")
public class AirPlanelStrategy implements TravelStrategy {
@Override
public Result travel(String travelType) {
return new Result("坐飞机");
}
}
骑自行车实现:
/**
* author:公众号:java狂神
* Date:2021/5/22
* Time:1:46 下午
*/
@Service("Bicycle")
public class BicycleStrategy implements TravelStrategy {
@Override
public Result travel(String travelType) {
return new Result("骑自行车!");
}
}
乘坐火车实现:
/**
* author:公众号:java狂神
* Date:2021/5/22
* Time:1:45 下午
*/
@Service("Train")
public class TrainStrategy implements TravelStrategy {
@Override
public Result travel(String travelType) {
return new Result("乘坐火车");
}
}
这里我把所有出行方式类都用 @Service 注解生成 Bean 放入 Spring Bean 容器中了,在使用策略的时候就不用 new 支付对象了,可以直接使用 Bean,这样更贴近业务。
3、使用策略
我把每一种出行方式,当做参数传递到方法参数里面,他就会调用与之匹配的实现方法!
@RestController
public class TraveController {
@Autowired
private ApplicationContext applicationContext;
@GetMapping("/travelSelect")
@ResponseBody
public Result Travel(@RequestParam("traveType") String traveType) {
// 根据出行方式类型获取对应的策略 bean
TravelStrategy travelStrategy = applicationContext.getBean(traveType, TravelStrategy.class );
// 出行
Result result = travelStrategy.travel(traveType);
return result;
}
}
测试一下:
测试 OK,传入不同的出行方式会调用不同的策略。
以上代码都是java中的基础知识。运用设计模式中的策略模式。把变化的部分提取出来变为接口+实现。
策略模式注意点:
1.分析项目中变化部分与不变部分
2.多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性。
3.设计模式没有相应的库直接使用,有些库或框架本身就用某种设计模式设计的。
4.使用策略模式,我们可以轻松干掉大量的 if/ else,代码也更优雅,还能很灵活的扩展。