前言:
最近一直在學習基於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對象,沒有解除客戶端需要選擇判斷的壓力
總結:
通過使用策略模式很好的解決了之前項目中遇到的請求加密需求,而且做到了更加容易的擴展性。