策略模式、策略模式與Spring的碰撞
阿新 • • 發佈:2020-06-30
策略模式是GoF23種設計模式中比較簡單的了,也是常用的設計模式之一,今天我們就來看看策略模式。
### 實際案例
我工作第三年的時候,重構旅遊路線的機票查詢模組,旅遊路線分為四種情況:
- 如果A地-B地往返都可以直達,那麼查詢兩張機票(往返)
- 如果A地-B地去程無法直達,需要中轉,但是返程可以直達,那麼查詢三張機票(去程兩張,返程一張)
- 如果A地-B地去程可以直達,但是返程需要中轉,那麼查詢三張機票(去程一張,返程兩張)
- 如果A地-B地往返都無法直達,那麼查詢四張機票(去程兩張,返程兩張)
在我重構前,程式碼差不多是這樣的:
```
int type = 1;
// 往返都可以直達
if (type == 1) {
// 查詢出兩張機票
return;
}
// 去程無法直達,需要中轉,但是返程可以直達
if (type == 2) {
// 查詢出三張機票(去程兩張,返程一張)
return;
}
// 去程可以直達,但是返程需要中轉
if (type == 3) {
// 查詢出三張機票(去程一張,返程兩張)
return;
}
// 往返都無法直達
else{
// 查詢出四張機票(去程兩張,返程兩張)
return;
}
```
當時我還是菜雞(現在也是),也不懂什麼設計模式,就是感覺程式碼都寫在一個類中,實在是太長了,不夠清爽,不管是哪種型別的線路,最終都是返回機票集合,只是處理邏輯不同,可以提取一個接口出來,再開四個類去實現此介面,最後定義一個Map,Key是Type,Value是介面(實現類),根據Type決定呼叫哪個實現類,就像下面的醬紫:
```
public class Ticket {
private String desc;
public Ticket(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Ticket{" +
"desc='" + desc + '\'' +
'}';
}
}
```
```
public interface QueryTicketService {
List