1、什么是策略模式
策略模式其实也是在解耦,把策略的定义、创建、使用这三个部分解耦开来,因为本身策略模式也是基于接口编程,这样其实可以简单的理解客户端调用使用接口进行编程,可以通过工厂方法创建对应的策略模式,进而完成对应的程序功能。
2、代码实现
如果我们通过会员类型来判断会员权益的话,通常通过if-else来实现,但是如果会员类型很多的话,就会产生很多的if-else,这会显得不太雅观。所以这个时候策略模式出现了。
普通if-else实现:
public class DemoTest {
public Object cal(String type){
if (type.equals("L1")){
return "L1 10";
}else if (type.equals("L2")){
return "L2 20";
}
return "0";
}
}
使用策略模式:
主要的思路是创建一个策略接口,以及多个实现该接口的类。同时还要创建一个工厂,内聚所有的策略类。
//策略接口
public interface MemberStrategy {
//计算会员权益
Object cal();
//会员类型值
String getSupportType();
}
//策略类1
@Component
public class CommonMemberStrategy implements MemberStrategy{
@Override
public Object cal() {
return "L1 10";
}
@Override
public String getSupportType() {
return "L1";
}
}
//策略类2
@Component
public class UpperMemberStrategy implements MemberStrategy{
@Override
public Object cal() {
return "L2 20";
}
@Override
public String getSupportType() {
return "L2";
}
}
//策略工厂
@Component
@Slf4j
public class MemberStrategyFactory {
//注入所有的策略接口类
@Autowired
List<MemberStrategy> memberStrategies;
public MemberStrategy getStrategyByType(String type){
for (MemberStrategy memberStrategy : memberStrategies) {
if (type.equals(memberStrategy.getSupportType())){
return memberStrategy;
}
}
return null;
}
}
//接口测试类
@RestController
@RequestMapping
public class StrategyRest {
@Autowired
MemberStrategyFactory memberStrategyFactory;
@RequestMapping("/strategy")
public Object strategy(@RequestParam String type){
MemberStrategy memberStrategy = memberStrategyFactory.getStrategyByType(type);
return memberStrategy.cal();
}
}
测试
如果我们调用接口/strategy,并且参数tyoe="L1"的话,预期返回L1 10。
下面用postman测试下,结果和预期是一样的
3、总结
1、策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
2、但是策略模式将造成产生很多策略类,增加代码的复杂度。