释义
策略模式和多态很相似
可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。
实现
上代码:
| 
 1 
2 
3 
4 
5 
 | 
public interface CalcStrategy {         void calc(String ql);     } | 
定义几个实现类
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Servicepublic class HelloService implements CalcStrategy {    @Override    public void calc(String ql) throws SupportPortalException {                System.out.println("hello : " + ql);    }} | 
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Servicepublic class WorldService implements CalcStrategy {    @Override    public void calc(String ql) throws SupportPortalException {                System.out.println("world : " + ql);    }} | 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
 | 
@Componentpublic class DataCalcStrategy {    @Autowired    private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>();    public void calc(String type, String ql) {        CalcStrategy calcService = calcStrategyMap.get(type);        calcService.calc(ql);    }} | 
| 
 1 
2 
3 
4 
5 
6 
 | 
@Test    public void contextLoads() throws SupportPortalException {        dataCalcStrategy.calc("helloService", "666");        dataCalcStrategy.calc("worldService", "777");} | 
原理
@Autowired
在源码中写到
In case of a java.util.Collection or java.util.Map dependency type, the container will autowire all beans matching the declared value type. In case of a Map, the keys must be declared as type String and will be resolved to the corresponding bean names.
当Autowired注解在Collection 上时,会将所申明类的所有实现类都放在那个指定的Collection里;
如果Autowired和map使用的话呢,它将它bean的名称作为key,所有的bean作为value.
上面例子中
| 
 1 
2 
 | 
@Autowired   private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>(); | 
会把所有实现了CalcStrategy接口的类,放入这个map中,key是这些实现类bean的名称
| 
 1 
2 
3 
4 
 | 
public void calc(String type, String ql) {        CalcStrategy calcService = calcStrategyMap.get(type);        calcService.calc(ql);    } | 
这个方法会根据传进来的type(bean的名称),从map中取出具体实例,从而使用多态调用不同的方法。
更多java学习资料可关注:itheimaGZ获取
原文:https://www.cnblogs.com/zhuxiaopijingjing/p/12289908.html