使用场景
随着业务增加、修改等等,使得代码量不断增加,项目中使用的原有三方框架不再满足需求,或者框架过于老旧,有性能更优,更方便使用的框架出现了,需要更换框架,但是一旦切换框架,整个项目中需要调用的地方都需要统一修改。
技术实现
- 首先将我需要调用的功能交给代理
- 对用的代理具有实现功能的能力,并且可以有多个实现需要的对象
- 多个框架具有真正实现功能的能力,并对接在代理上
- 这样我们在更换框架时调用的地方不需要修改,由代理切换对应实现的框架即可
网络请求框架的实现--以POST请求为例
网络请求代理接口
package com.fly.newstart.dynamicproxy;
import java.util.Map;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: 网络请求代理接口
*/
public interface IHttpProcessor {
void post(String url, Map<String,Object> param, ICallBack callBack);
}
请求帮助类,连接插件实现 ,隔离了框架与使用
package com.fly.newstart.dynamicproxy;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: 请求帮助类,连接插件实现 ,隔离了框架与使用
*/
public class HttpHelper implements IHttpProcessor {
private static HttpHelper instance;
private static IHttpProcessor mIHttpProcessor;
private HttpHelper() {}
public static HttpHelper getInstance() {
synchronized (HttpHelper.class) {
if (instance == null) {
instance = new HttpHelper();
//更换框架,更换实践
mIHttpProcessor = new OkHttpProcessor();
// mIHttpProcessor = new VolleyProcessor(BaseApplication.getAppContext());
}
}
return instance;
}
@Override
public void post(String url, Map<String, Object> param, ICallBack callBack) {
if (mIHttpProcessor == null) return;
mIHttpProcessor.post(appendParams(url, param), param, callBack);
}
private String appendParams(String url, Map<String, Object> params) {
if (params == null || params.isEmpty()) return url;
StringBuffer urlBuffer = new StringBuffer(url);
if (urlBuffer.indexOf("?") <= 0) {
urlBuffer.append("?");
} else if (!urlBuffer.toString().endsWith("?")) {
urlBuffer.append("&");
}
for (Map.Entry<String, Object> entry : params.entrySet()) {
urlBuffer.append("&").append(entry.getKey()).append("=").append(encode(entry.getValue().toString()));
}
return urlBuffer.toString();
}
private String encode(String str) {
try {
return URLEncoder.encode(str, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
}
请求回调接口
package com.fly.newstart.dynamicproxy;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: 请求回调接口
*/
public interface ICallBack {
void onSuccess(String result);
void onFailure();
}
回调实现解析数据
package com.fly.newstart.dynamicproxy;
import com.google.gson.Gson;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: 回调实现解析数据
*/
public abstract class HttpCallBack<Result> implements ICallBack {
@Override
public void onSuccess(String result) {
//将网络访问框架得到的数据解析
Gson gson = new Gson();
//获取HttpCallBack后面的泛型
Type type = analysisClassInfo(this);
Result objResult = gson.fromJson(result, type);
onsuccess(objResult);
}
private Type analysisClassInfo(Object obj) {
//相当于可以得到参数化内型,类型变量,基础类型
Type genType = obj.getClass().getGenericSuperclass();
Type[] actualType = ((ParameterizedType) genType).getActualTypeArguments();
return actualType[0];
}
public abstract void onsuccess(Result objResult);
@Override
public void onFailure() {
}
}
okhttp框架具体实现
package com.fly.newstart.dynamicproxy;
import android.os.Handler;
import java.io.IOException;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: okhttp具体实现
*/
public class OkHttpProcessor implements IHttpProcessor {
private OkHttpClient mOkHttpClient;
private Handler mHandler;
public OkHttpProcessor() {
mOkHttpClient = new OkHttpClient();
mHandler = new Handler();
}
@Override
public void post(String url, Map<String, Object> param, final ICallBack callBack) {
RequestBody requestBody = appendBody(param);
Request request = new Request.Builder().url(url).post(requestBody).build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
final String str = response.body().string();
mHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(str);
}
});
}
}
});
}
private RequestBody appendBody(Map<String, Object> param) {
FormBody.Builder body = new FormBody.Builder();
if (param == null || param.isEmpty()) {
return body.build();
}
for (Map.Entry<String, Object> entry : param.entrySet()) {
body.add(entry.getKey(), entry.getValue().toString());
}
return body.build();
}
}
Volley框架具体实现
package com.fly.newstart.dynamicproxy;
import android.content.Context;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import java.util.Map;
import okhttp3.FormBody;
import okhttp3.RequestBody;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 创建时间 : 2019/4/25
* 描述: Volley框架具体实现
*/
public class VolleyProcessor implements IHttpProcessor {
private RequestQueue mQueue;
public VolleyProcessor(Context context) {
mQueue = Volley.newRequestQueue(context);
}
@Override
public void post(String url, Map<String, Object> param, final ICallBack callBack) {
StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
callBack.onSuccess(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
callBack.onFailure();
}
});
mQueue.add(stringRequest);
}
}
在切换框架时只需要在HttpHelper中修改框架具体实现的框架即可,实现一句代码实现框架切换的过程