Java設計模式之策略模式(Strategy)

總李寫程式碼發表於2016-08-09

前言:

     最近一直在學習基於okHttp網路請求,學習的過程中就想起了之前專案中有這麼一個需求不同的介面要採用不同的加密方式,比如登入之前要採用RSA加密,登入之後要採用AES加密,當時是採用靠傳遞一個引數過去來對引數進行不同的加密演算法,這樣會讓程式碼難以維護而且難以擴充套件,那該如何解決呢?今天來學習一下策略模式Strategy!用它來解決這個問題。

策略模式:

       策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有共同介面的獨立的類中,從而使得它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。

舉例說明如何使用策略模式:

       還是以之前專案中的為不同的請求採用不同的加密方式為例說明。

1.)未採用策略模式的實現方式

    enum EncryptType{AES,RSA};
    public void doRequest(EncryptType  type ,String params){
        switch (type){
            case AES:
                // 此處進行AES加密演算法
                params="經過AES加密過資料";
                break;
            case RSA:
                // 此處進行RSA加密演算法
                params="經過RSA加密過資料";
                break;
        }
       //然後呼叫網路請求將引數傳送過去
    }

上面的程式碼可以看出如果要繼續增加其他方式的加密演算法的時候,只有通過增加EncryptType列舉型別,然後增加型別判斷,不僅破壞了網路請求結構,也導致了耦合性很高不利於擴充套件。

2.)使用策略模式第一步:宣告加密介面

public interface IEncryptStrategy {

    String encryptStr(String params);
}

3.)使用策略模式第二步:新增不同的策略

RSA方式

public class RSAStrategy implements IEncryptStrategy {
    @Override
    public String encryptStr(String params) {
        return "經過RSA加密過資料";
    }
}

AES方式

public class AESStrategy implements IEncryptStrategy {
    @Override
    public String encryptStr(String params) {
        return "經過AES加密過的資料";
    }
}

3.)使用策略模式第三步:選擇不同的策略

使用策略

        IEncryptStrategy rsaStrategy=new RSAStrategy();
        doRequest(rsaStrategy,"test");

接收策略

    public void doRequest(IEncryptStrategy encryptStrategy , String params){
        params=encryptStrategy.encryptStr(params);
       //然後呼叫網路請求將引數傳送過去
    }

通過上面的例子我們總結一下策略模式的優缺點:

優點:

1、 簡化了單元測試,因為每個演算法都有自己的類,可以通過自己的介面單獨測試。 
2、 避免程式中使用多重條件轉移語句,使系統更靈活,並易於擴充套件。 
3、 遵守大部分GRASP原則和常用設計原則,高內聚、低偶合。

缺點: 
1、 因為每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量。

2、 在基本的策略模式中,選擇所用具體實現的職責由客戶端物件承擔,並轉給策略模式的Context物件,沒有解除客戶端需要選擇判斷的壓力

 

總結:

    通過使用策略模式很好的解決了之前專案中遇到的請求加密需求,而且做到了更加容易的擴充套件性。

相關文章