1. 程式人生 > >策略模式、策略模式與Spring的碰撞

策略模式、策略模式與Spring的碰撞

策略模式是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