Java設計模式(8)——策略模式


一、策略模式定義

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類圖

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM