6,策略模式
一,什麽是策略模式
Strategy模式也叫策略模式是行為模式之一,它對一系列的算法加以封裝,為所有算法定義一個抽象的算法接口,並通過繼承該抽象算法接口對所有的算法加以封裝和實現,具體的算法選擇交由客戶端決定(策略)。Strategy模式主要用來平滑地處理算法的切換 。
二,例子
三個要素
抽象策略角色(Strategy):這是一個抽象角色(接口或者抽象類),通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略角色(ConcreteStrategy):包裝了相關的算法或行為。
環境角色(Context):持有一個抽象策略角色(Strategy)的引用。
抽象策略角色(Strategy):Strategy
/** * * @類名稱:Strategy * @類描述:抽象策略角色(Strategy):這是一個抽象角色(接口或者抽象類),通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。 * @創建人:zender */ public interface Strategy { public void discount(); }
具體策略角色(ConcreteStrategy):VIPStrategy,SVIPStrategy
/** * * @類名稱:VIPStrategy * @類描述:具體策略角色(ConcreteStrategy):包裝了相關的算法或行為。 * @創建人:zender*/ public class VIPStrategy implements Strategy{ @Override public void discount() { System.out.println("普通會員9折優惠!"); } }
/** * * @類名稱:SVIPStrategy * @類描述:具體策略角色(ConcreteStrategy):包裝了相關的算法或行為。 * @創建人:zender */ public class SVIPStrategy implements Strategy { @Overridepublic void discount() { System.out.println("超級會員8折優惠!"); } }
環境角色(Context):VIPContext
/** * * @類名稱:VIPContext * @類描述:環境角色(Context):持有一個抽象策略角色(Strategy)的引用。 * @創建人:zender */ public class VIPContext { private Strategy str; public VIPContext(Strategy str) { this.str = str; } public void discount(){ this.str.discount(); } }
測試類:Test
/** * * @類名稱:Test * @類描述:測試類 * @創建人:zender */ public class Test { public static void main(String[] args) { VIPContext vContext = new VIPContext(new VIPStrategy()); vContext.discount(); System.out.println("--------------"); vContext = new VIPContext(new SVIPStrategy()); vContext.discount(); } }
結果:
三、優點缺點
1,優點
(1) 策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類裏面,從而避免重復的代碼。
(2)策略模式提供了可以替換繼承關系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那麽使用算法或行為的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起,從而不可能再獨立演化。繼承使得動態改變算法或行為變得不可能。
(3) 使用策略模式可以避免使用多重條件轉移語句。多重轉移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統統列在一個多重轉移語句裏面,比使用繼承的辦法還要原始和落後。
2,缺點
(1) 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道所有的算法或行為的情況。
(2) 策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態保存到客戶端裏面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。
6,策略模式