基於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獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM