应用场景:
实际开发:
最近在项目中遇到一个开发场景,需要根据type值判断来执行对应的业务逻辑,这样就涉及到重复的if-else的问题,为了解决这样重复的代码来造成的代码冗余的问题,所以考虑使用策略模式,根据具体的场景执行对应的策略,来解决问题。本文简单写一个测试Demo,实际开发需要根据具体业务,具体实现对应的业务逻辑。
总结:
因为业务需求需要重复的判断,造成代码冗余。
具体方案(简单Demo):
设计模式:策略模式
常用注解:@Component @Autowried @Service(Bean注解都可以,并非必须用这几个)
开发环境:Spring环境 (Boot最佳)
注意:
- bean的名称必须定义,最好根据业务取实际意义的名称,方便代码阅读。
- 从Map中寻找对应的策略实现类执行对应方法时应该抓取异常,因为如果没有找到的话,会报异常错误。
- 最好使用线程安全的ConcurrentHashMap来装全部的策略实现类,防止出现线程安全问题。
首先创建策略接口
/**
* @author LMY
* @Date 2019/12/17
*/
public interface Strategy {
String getMember();
}
实现类实现策略接口
@Component("one")
public class OneStrategy implements Strategy {
@Override
public String getMember() {
return "one";
}
}
@Component("two")
public class TwoStrategy implements Strategy {
@Override
public String getMember() {
return "two";
}
}
创建策略执行器(将实现类注入到公有Map中)
@Service
public class NumberContext {
// 使用线程安全的ConcurrentHashMap
private final Map<String, Strategy> strategyMap = new ConcurrentHashMap<>();
// Autowired注解会自动将实现策略接口的实现类注入到Map中,key就是自定义的Bean的名称
@Autowired
public NumberContext(Map<String, Strategy> strategyMap) {
this.strategyMap.clear();
strategyMap.forEach((k, v)-> this.strategyMap.put(k, v));
}
// 根据传入的标签与Map中的key对比,执行对应的逻辑
public String getResource(String number){
return strategyMap.get(number).getMember();
}
}
编写测试类测试
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private NumberContext numberContext;
@GetMapping("number")
public String getNumber(String number){
return numberContext.getResource(number);
}
}