前言:
最近一直在学习基于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对象,没有解除客户端需要选择判断的压力
总结:
通过使用策略模式很好的解决了之前项目中遇到的请求加密需求,而且做到了更加容易的扩展性。