使用場景
隨著業(yè)務(wù)增加、修改等等,使得代碼量不斷增加,項目中使用的原有三方框架不再滿足需求,或者框架過于老舊,有性能更優(yōu),更方便使用的框架出現(xiàn)了,需要更換框架,但是一旦切換框架,整個項目中需要調(diào)用的地方都需要統(tǒng)一修改。
技術(shù)實現(xiàn)
- 首先將我需要調(diào)用的功能交給代理
- 對用的代理具有實現(xiàn)功能的能力,并且可以有多個實現(xiàn)需要的對象
- 多個框架具有真正實現(xiàn)功能的能力,并對接在代理上
- 這樣我們在更換框架時調(diào)用的地方不需要修改,由代理切換對應(yīng)實現(xiàn)的框架即可
網(wǎng)絡(luò)請求框架的實現(xiàn)--以POST請求為例
網(wǎng)絡(luò)請求代理接口
package com.fly.newstart.dynamicproxy;
import java.util.Map;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 創(chuàng)建時間 : 2019/4/25
* 描述: 網(wǎng)絡(luò)請求代理接口
*/
public interface IHttpProcessor {
void post(String url, Map<String,Object> param, ICallBack callBack);
}
請求幫助類,連接插件實現(xiàn) ,隔離了框架與使用
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
* 創(chuàng)建時間 : 2019/4/25
* 描述: 請求幫助類,連接插件實現(xiàn) ,隔離了框架與使用
*/
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();
}
}
}
請求回調(diào)接口
package com.fly.newstart.dynamicproxy;
/**
* <pre>
* .----.
* _.'__ `.
* .--(Q)(OK)---/$\
* .' @ /$$$\
* : , $$$$$
* `-..__.-' _.-\$/
* `;_: `"'
* .'"""""`.
* /, FLY ,\
* // \\
* `-._______.-'
* ___`. | .'___
* (______|______)
* </pre>
* 包 名 : com.fly.newstart.dynamicproxy
* 作 者 : FLY
* 創(chuàng)建時間 : 2019/4/25
* 描述: 請求回調(diào)接口
*/
public interface ICallBack {
void onSuccess(String result);
void onFailure();
}
回調(diào)實現(xiàn)解析數(shù)據(jù)
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
* 創(chuàng)建時間 : 2019/4/25
* 描述: 回調(diào)實現(xiàn)解析數(shù)據(jù)
*/
public abstract class HttpCallBack<Result> implements ICallBack {
@Override
public void onSuccess(String result) {
//將網(wǎng)絡(luò)訪問框架得到的數(shù)據(jù)解析
Gson gson = new Gson();
//獲取HttpCallBack后面的泛型
Type type = analysisClassInfo(this);
Result objResult = gson.fromJson(result, type);
onsuccess(objResult);
}
private Type analysisClassInfo(Object obj) {
//相當(dāng)于可以得到參數(shù)化內(nèi)型,類型變量,基礎(chǔ)類型
Type genType = obj.getClass().getGenericSuperclass();
Type[] actualType = ((ParameterizedType) genType).getActualTypeArguments();
return actualType[0];
}
public abstract void onsuccess(Result objResult);
@Override
public void onFailure() {
}
}
okhttp框架具體實現(xiàn)
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
* 創(chuàng)建時間 : 2019/4/25
* 描述: okhttp具體實現(xiàn)
*/
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框架具體實現(xiàn)
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
* 創(chuàng)建時間 : 2019/4/25
* 描述: Volley框架具體實現(xiàn)
*/
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中修改框架具體實現(xiàn)的框架即可,實現(xiàn)一句代碼實現(xiàn)框架切換的過程