释义
策略模式和多态很相似
可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。
实现
上代码:
- 定义一个统一的接口:
[JavaScript] 纯文本查看 复制代码
1 2 3 4 5 | public interface CalcStrategy { void calc(String ql); } |
定义几个实现类
[JavaScript] 纯文本查看 复制代码
1 2 3 4 5 6 7 8 | @Service public class HelloService implements CalcStrategy { @Override public void calc(String ql) throws SupportPortalException { System.out.println( "hello : " + ql); } } |
[JavaScript] 纯文本查看 复制代码
1 2 3 4 5 6 7 8 | @Service public class WorldService implements CalcStrategy { @Override public void calc(String ql) throws SupportPortalException { System.out.println( "world : " + ql); } } |
- 定义一个策略类
[JavaScript] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 | @Component public 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); } } |
- 来个测试类
[JavaScript] 纯文本查看 复制代码
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.
上面例子中
[JavaScript] 纯文本查看 复制代码
1 2 | @Autowired private Map<String, CalcStrategy> calcStrategyMap = new HashMap<>(); |
会把所有实现了CalcStrategy接口的类,放入这个map中,key是这些实现类bean的名称
- 策略
[Pascal] 纯文本查看 复制代码
1 2 3 4 | public void calc( String type , String ql) { CalcStrategy calcService = calcStrategyMap.get(type); calcService.calc(ql); } |
这个方法会根据传进来的type(bean的名称),从map中取出具体实例,从而使用多态调用不同的方法。
更多java学习资料可关注:itheimaGZ获取