本文先介绍策略模式(Strategy)基本概念及使用;接着介绍实际工作如何结合spring一起使用.
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。关于策略模式基本使用方式本文不作介绍,其他博客可以找到一大堆,如:https://www.cnblogs.com/wuyudong/p/5924223.html
策略模式在spring中使用
对于java开发者而言,必不可少的框架就是spring框架,有了spring框架,我们使用设计模式就不必那么繁琐了.
1.定义一个加密的接口
public interface Strategy {
//加密类型
String type();
//加密
void encrypt();
}
2.实现具体的两个加密类
@Component
public class MD5Strategy implements Strategy {
@Override
public String type() {
return "MD5";
}
@Override
public void encrypt() {
System.out.println("--MD5策略模式---");
}
}
@Component
public class SHA1Strategy implements Strategy {
@Override
public String type() {
return "SHA1";
}
@Override
public void encrypt() {
System.out.println("--SHA1策略模式---");
}
}
3.环境(Context)角色:持有一个Strategy的引用。
@Component
public class Context implements ApplicationContextAware {
//所有加密实现类放入一个map中
private Map<String, Strategy> strategyMap = new HashMap<>();
public Context() {}
public void encrypt(String type) {
Strategy strategy = strategyMap.get(type);
strategy.encrypt();
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
//获取所有Strategy的实现类
Map<String, Strategy> beansOfType = applicationContext.getBeansOfType(Strategy.class);
for (Strategy bean : beansOfType.values()) {
strategyMap.put(bean.type(), bean);
}
System.out.println(beansOfType.size());
}
}
4.测试
@RestController
public class Test {
@Autowired
Context context;
@GetMapping
public String a(String type){
context.encrypt(type);
return "succ";
}
}
这样一个简单易用的策略模式就写好了,如果突然要加另一个加密类型如SHA2, 只需加一个SHA2的实现类,其他地方不用任何修改.