在开发使用到网络框架时,我们可能会选择OkHttp,Volley等等进行封装,当我们想换请求卡框架的时候,只需要一行代码就能搞定,而不用去翻每一个请求进行修改。下面是一个基于代理模式的封装。
首先,我们定义接口IHttpProcessor 及回调Callback,执行请求的每一个类都会实现IHttpProcessor 接口。
public interface IHttpProcessor {
void get(String url,Map<String,Object> param,Callback callback);
void post(String url,Map<String,Object> param,Callback callback);
}
public interface Callback {
void onSucess(String result);
void onFailure(Exception e);
}
然后,我们再定义一个HttpHelper,使用变种代理模式进行请求转发,变种构建者模式进行参数构建。
public class HttpHelper {
private static final int REQUEST_TYPE_GET=0;
private static final int REQUEST_TYPE_POST=1;
private int mDefaultType;
public static IHttpProcessor mIHttpProcessor;//真正的请求执行者
private String mUrl;
private Map<String, Object> mParams;
public HttpHelper(){
mParams=new HashMap<>();
}
public static void init(IHttpProcessor iHttpProcessor ){
mIHttpProcessor=iHttpProcessor;
}
public static HttpHelper obtain(){
return new HttpHelper();
}
/* 代理get请求 */
public void get( Callback callback) {
mDefaultType=REQUEST_TYPE_GET;
request(callback);
}
/* 代理post请求 */
public void post(Callback callback) {
mDefaultType=REQUEST_TYPE_POST;
request(callback);
}
//真正的请求
public void request(Callback callback){
switch (mDefaultType){
case REQUEST_TYPE_GET:
mIHttpProcessor.get(mUrl,mParams,callback);
break;
case REQUEST_TYPE_POST:
mIHttpProcessor.post(mUrl,mParams,callback);
break;
}
}
public HttpHelper url(String url){
this.mUrl = url;
return this;
}
public HttpHelper params(Map<String, Object> params) {
this.mParams = params;
return this;
}
}
下面是在Activity中的调用
public class TestActivity extends AppCompatActivity{
private String url="";
private Map<String,Object> params=new HashMap<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
HttpHelper.obtain()
.url(url)
.params(params)
.get(new Callback() {
@Override
public void onSucess(String result) {
}
@Override
public void onFailure(Exception e) {
}
});
}
}
可以看出来,我们真正负责去请求网络的IHttpProcessor还没有实现,而是在init(IHttpProcessor)的时候传入的。这样我们的请求就可以再去选择是使用Volley或者是OkHttp去进行定义,而我们的Activity根本就不用做出改变,这就是设计模式的巧妙的利用。
下面就是简单的IHttpProcessor,
/**
* Created by Administrator
* on 2017/4/18.
* 基于Volley
*/
public class VolleyProcessor implements IHttpProcessor {
@Override
public void get(String url, Map<String, Object> param, Callback callback) {
}
@Override
public void post(String url, Map<String, Object> param, Callback callback) {
}
}
/**
* Created by Administrator
* on 2017/4/18.
* 基于OkHttp
*/
public class OkHttpProcessor implements IHttpProcessor {
public OkHttpProcessor(){
}
@Override
public void get(String url, Map<String, Object> param, Callback callback) {
}
@Override
public void post(String url, Map<String, Object> param, Callback callback) {
}
}
当然,必不可少的是init(IHttpProcessor )的初始化,在这里我们可以在App里面进行初始化
/**
* Created by Administrator
* on 2017/4/18.
*/
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
HttpHelper.init(new OkHttpProcessor());
// HttpHelper.init(new VolleyProcessor());
}
}
这样我们就基本完成了这个小框架的打造,当然IHttpProcessor 的具体实现就要大家自己来做了。
写不不够完善,希望大家帮忙补充,谢谢。。