基于Springboot注解的策略模式

释义

策略模式和多态很相似

可以理解为定义了一个统一的接口,有许多不同的实现类,可以自由选择不同的实时类去执行。

实现

上代码:

  • 定义一个统一的接口:
[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获取

猜你喜欢

转载自www.cnblogs.com/zhuxiaopijingjing/p/12289908.html