一、策略模式定義
Strategy模式也叫策略模式是行為模式之一,它對一系列的算法加以封裝,為所有算法定義一個抽象的算法接口,並通過繼承該抽象算法接口對所有的算法加以封裝和實現,具體的算法選擇交由客戶端決定(策略)。Strategy模式主要用來平滑地處理算法的切換 。
二、策略模式的結構
- 封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模塊對策略的直接調用。
- 抽象策略:通常情況下為一個接口,當各個實現類中存在着重復的邏輯時,則使用抽象類來封裝這部分公共的代碼,此時,策略模式看上去更像是模版方法模式。
- 具體策略:具體策略角色通常由一組封裝了算法的類來擔任,這些類之間可以根據需要自由替換。
三、策略模式的特點
- 策略模式提供了可以替換繼承關系的辦法。
- 使用策略模式可以避免使用多重條件轉移語句。
四、策略模式的缺點
1. 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道所有的算法或行為的情況。
2. 策略模式造成很多的策略類。有時候可以通過把依賴於環境的狀態保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。
五、Demo
抽象策略
public interface Strategy { //加密 public void encrypt(); }
具體策略
public class MD5Strategy implements Strategy{ public void encrypt() { System.out.println("執行MD5加密"); } }
public class SHA1Strategy implements Strategy{ public void encrypt() { System.out.println("執行SHA1加密"); } }
封裝類
public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void encrypt() { this.strategy.encrypt(); } }
客戶端調用
public class MainClass { public static void main(String[] args) { // Strategy stra = new SHA1Strategy(); // stra.encrypt(); Context context = new Context(new MD5Strategy()); context.encrypt(); } }
六、UML類圖