釋義
策略模式和多態很相似
可以理解為定義了一個統一的接口,有許多不同的實現類,可以自由選擇不同的實時類去執行。
實現
上代碼:
- 定義一個統一的接口:
[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獲取