摘要:在這個算法類中封裝了大量查找算法,該類代碼將較復雜,維護較為困難。換言之,策略模式只適用于客戶端知道算法或行為的情況。策略模式概覽圖參考菜鳥教程策略模式十種常用的設計模式大部分自己總結,部分摘抄與模式之策略模式
策略模式
? 我們都知道商場打折的時候,會根據會員的等級情況進行不同的折扣優惠,如果是VIP會員,那么可能就是5折優惠,如果是一般會員就是8折優惠,如果是普通顧客就是9折優惠,那么在結賬的時候如何根據會員的等級進行不同的計算價格的方式呢?那么這個時候策略模式就派上用場了
定義定義一組算法,將每個算法都封裝起來,并且使他們之間可以互換。
動機? 在軟件系統中,有許多算法可以實現某一功能,如查找、排序等,一種常用的方法是硬編碼(Hard Coding)在一個類中,如需要提供多種查找算法,可以將這些算法寫到一個類中,在該類中提供多個方法,每一個方法對應一個具體的查找算法;
? 當然也可以將這些查找算法封裝在一個統一的方法中,通過if…else…等條件判斷語句來進行選擇。
? 這兩種實現方法我們都可以稱之為硬編碼,如果需要增加一種新的查找算法,需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端調用代碼。在這個算法類中封裝了大量查找算法,該類代碼將較復雜,維護較為困難。
結構 組件Context:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。
實現strategy類
package Strategy; public interface Strategy { public void method1(); public void method2(); }
具體策略
package Strategy; public class ConcreteStrategy1 implements Strategy { @Override public void method1() { System.out.println("ConcreteStrategy1===算法1-version1"); } @Override public void method2() { System.out.println("ConcreteStrategy1===算法2-version1"); } }
package Strategy; public class ConcreteStrategy2 implements Strategy { @Override public void method1() { System.out.println("ConcreteStrategy2===算法1-version2"); } @Override public void method2() { System.out.println("ConcreteStrategy2====算法2-version2"); } }
context
package Strategy; public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void method(){ System.out.println("選擇算法:" ); strategy.method1(); strategy.method2(); } }
client
package Strategy; public class Client { public static void main(String[] args){ Strategy concreteStrategy1 = new ConcreteStrategy1(); Context context = new Context(concreteStrategy1); context.method(); Strategy concreteStrategy2 = new ConcreteStrategy2(); Context context1 = new Context(concreteStrategy2); context1.method(); } } //選擇算法: // ConcreteStrategy1===算法1-version1 // ConcreteStrategy1===算法2-version1 //選擇算法: // ConcreteStrategy2===算法1-version2 // ConcreteStrategy2====算法2-version2應用案例
如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為
一個系統需要動態地在幾種算法中選擇一種
如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。
實際應用案例:旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略
strategy
package Strategy; public interface Strategy { public void travel(); }
ConcreteStrategy1
package Strategy; public class ConcreteStrategy1 implements Strategy { @Override public void travel() { System.out.println("坐飛機"); } }
ConcreteStrategy2
package Strategy; public class ConcreteStrategy2 implements Strategy { @Override public void travel() { System.out.println("坐火車"); } }
context
package Strategy; public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void method(){ System.out.println("選擇出行方式:" ); strategy.travel(); } }
client
package Strategy; public class Client { public static void main(String[] args){ Strategy concreteStrategy1 = new ConcreteStrategy1(); Context context = new Context(concreteStrategy1); context.method(); Strategy concreteStrategy2 = new ConcreteStrategy2(); Context context1 = new Context(concreteStrategy2); context1.method(); } } //選擇出行方式: // 坐飛機 //選擇出行方式: // 坐火車優點
繼承方面看(strategy-concreteStrategy)
可以靈活地增加新的算法或行為,只需要重新定義一個concretestrategy并實現strategy接口就行了
提供了管理相關的算法族的辦法,使得所有的相似的算法都繼承一個接口進行管理
避免使用多重條件(if-else)語句。多重條件語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重條件語句里面,比使用繼承的辦法還要原始和落后
保證了各個策略算法的平等性。對于一系列具體的策略算法,大家的地位是完全一樣的,正因為這個平等性,才能實現算法之間可以相互替換。所有的策略算法在實現上也是相互獨立的,相互之間是沒有依賴的。
從用戶的角度來看
不修改原有系統的基礎上選擇算法或行為,將選擇算法的權力交給用戶,用戶想要哪種算法就實例化哪種
缺點
繼承方面看
如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
用戶角度看
客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道算法或行為的情況。
策略模式概覽圖 參考菜鳥教程
5. 策略模式
十種常用的設計模式(大部分自己總結,部分摘抄)
《JAVA與模式》之策略模式
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74937.html
摘要:可以使用其他模式來修正這個缺陷,如工廠方法模式代理模式或享元模式。我們的策略模式只是實現了策略的管理,但是沒有嚴格地定義適當的場景使用適當的策略,在實際項目中,一般通過工廠方法模式來實現策略類的聲明。源碼地址參考文獻設計模式之禪 定義 Define a family of algorithms,encapsulate each one,and make them interchange...
摘要:一定義定義維基百科策略模式作爲一種軟件設計模式,指對象有某個行爲,但是在不同的場景中,該行爲有不同的實現算法。二策略模式圖我們看看策略模式是有怎樣設計結構的。如中創建線程池,線程池任務滿時,對提交的任務做處理就使用了策略模式。以前完整的看過《大話設計模式》,雖然完整看過,也做過筆記,但現在依然很多已經很模糊。這段時間趁著離職,有時間,打算重新過一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:孫臏心里一萬個草泥馬在奔騰,差點沒噎死自己滾一邊去,我們這盤跟他賽馬開始,策略模式上場。在設計模式之禪中的提出通過策略枚舉和反射機制對策略模式進行改良,膜拜了但是要添加或淘汰策略,還是得去對枚舉進行修改,也不符合開閉原則。 今天給大家說說田忌賽馬的故事。如有雷同,純屬巧合!話說在戰國時期,群雄割據,硝煙四起,茶余飯后還是少不了娛樂活動的,其中賽馬是最火爆的。一天,孫臏看到田忌像個死雞似...
閱讀 25638·2021-09-29 09:41
閱讀 4799·2021-09-10 11:20
閱讀 1925·2021-09-09 09:32
閱讀 1888·2019-08-30 15:44
閱讀 3195·2019-08-29 17:13
閱讀 2813·2019-08-29 14:14
閱讀 2067·2019-08-29 14:11
閱讀 3230·2019-08-29 12:36