代理的定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
开闭原则:代码的功能是开放的,对于已经写好的代码要做到关闭
下面介绍的这个案例是访问网络的代理实现
HttpProxy类是访问网络的代理,具体的被代理对象是VolleyModel 和 OkHttpModel
切换网络框架只要在MyAppcation中修改一行代码就ok,实现了编码的开闭原则
public void onCreate() {
super.onCreate();
context = getApplicationContext();
// HttpProxy.init(VolleyModel.getInstance(context));
HttpProxy.init(OKHttpModel.getInstance(context));
}
代理类代码
// 代理类:它包含真正的对象,访问者对代理对象的访问,可以被代理对象转变成为真正的对象访问
public class HttpProxy implements IHttp {
private static IHttp mHttp = null;
/**
* 请求URL
*/
private String mUrl;
/**
* 请求参数
*/
private Map<String, Object> mParams;
private volatile static HttpProxy mInstance;
public HttpProxy() {
mParams = new HashMap<>();
}
public static HttpProxy obtain(){
if (mInstance == null){
synchronized (HttpProxy.class){
if (mInstance == null){
mInstance = new HttpProxy();
}
}
}
return mInstance;
}
public static void init(IHttp http){
mHttp = http;
}
@Override
public void post(String url, Map<String, Object> params, ICallBack callBack) {
//事情的事前准备工作
mHttp.post(url,params,callBack);
//事情的事后处理
}
@Override
public <T> void get(String url, Map<String, Object> params, ICallBack<T> callBack) {
//事情的事前准备工作
mHttp.get(url,params,callBack);
//事情的事后处理
}
}
代理接口
//行为规范的接口,表示代理类能代理什么事情
public interface IHttp {
void post(String url, Map<String,Object> params,ICallBack callBack);
<T> void get(String url, Map<String,Object> params,ICallBack<T> callBack);
//put
//down
}
下面就是真正的被代理对象
public class VolleyModel implements IHttp {
private static final String TAG = "VolleyModel";
private static RequestQueue mQueue;
private static volatile VolleyModel mInstance;
private VolleyModel(Context context) {
mQueue = Volley.newRequestQueue(context);
}
public static VolleyModel getInstance(Context context) {
if (mInstance == null) {
synchronized (HttpProxy.class) {
if (mInstance == null) {
mInstance = new VolleyModel(context);
}
}
}
return mInstance;
}
@Override
public void post(String url, Map params, ICallBack callBack) {
}
@Override
public <T> void get(String url, Map<String, Object> params, final ICallBack<T> callBack) {
String finalUrl = HttpUtils.appendParams(url, params);
System.out.println("finalUrl : " + finalUrl);
StringRequest request = new StringRequest(Request.Method.GET, finalUrl, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
System.out.println("response : " + response);
Gson gson = new Gson();
//1得到该泛型类的子类对象的Class对象,这个是获取类上面的泛型
// Type genType = callBack.getClass().getGenericSuperclass();
// System.out.println("genType : " + genType);
// Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
// System.out.println("genType 2 :" +params[0]);
// T obj = gson.fromJson(response, params[0]);
// 这个是获取接口上面的泛型 Class
Type[] types = callBack.getClass().getGenericInterfaces();
ParameterizedType parameterizedType = (ParameterizedType) types[0];
Type type = parameterizedType.getActualTypeArguments()[0];
T obj = gson.fromJson(response, type);
callBack.onSuccess(obj);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
callBack.onFailure(volleyError.toString());
}
});
mQueue.add(request);
}
private static class HttpUtils {
public static String appendParams(String url, Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
sb.append(url);
sb.append("?");
Set<Map.Entry<String, Object>> entries = params.entrySet();
for (Map.Entry<String, Object> set : entries) {
sb.append(set.getKey()).append("=").append(set.getValue()).append("&");
}
return sb.toString();
}
}
}
public class OKHttpModel implements IHttp {
private static final String TAG = "OKHttpModel";
private static volatile OKHttpModel mInstance;
private OKHttpModel() {
//配置超时时间等信息
OkHttpClient okHttpClient = new OkHttpClient.Builder()
// .addInterceptor(new LoggerInterceptor("TAG"))
.connectTimeout(30000L, TimeUnit.MILLISECONDS)
.readTimeout(30000L, TimeUnit.MILLISECONDS)
//其他配置
.build();
OkHttpUtils.initClient(okHttpClient);
}
public static OKHttpModel getInstance(Context context) {
if (mInstance == null) {
synchronized (HttpProxy.class) {
if (mInstance == null) {
mInstance = new OKHttpModel();
}
}
}
return mInstance;
}
@Override
public void post(String url, Map params, ICallBack callBack) {
}
@Override
public <T> void get(String url, Map<String, Object> params, final ICallBack<T> callBack) {
String finalUrl = HttpUtils.appendParams(url, params);
System.out.println("finalUrl : " + finalUrl);
OkHttpUtils.get().url(finalUrl).build().execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
callBack.onFailure(e.getMessage());
}
@Override
public void onResponse(String response, int id) {
System.out.println("lgj :" + TAG + " ----------- ");
Gson gson = new Gson();
Type[] types = callBack.getClass().getGenericInterfaces();
ParameterizedType parameterizedType = (ParameterizedType) types[0];
Type type = parameterizedType.getActualTypeArguments()[0];
T obj = gson.fromJson(response, type);
callBack.onSuccess(obj);
}
});
}
private static class HttpUtils {
public static String appendParams(String url, Map<String, Object> params) {
StringBuffer sb = new StringBuffer();
sb.append(url);
sb.append("?");
Set<Map.Entry<String, Object>> entries = params.entrySet();
for (Map.Entry<String, Object> set : entries) {
sb.append(set.getKey()).append("=").append(set.getValue()).append("&");
}
return sb.toString();
}
}
}
具体的调用如下:
HttpProxy.obtain().get("https://api.jisuapi.com/astro/all", params, new ICallBack<ConstellationBean>() {
@Override
public void onFailure(String error) {
}
@Override
public void onSuccess(ConstellationBean respose) {
if (respose != null){
String msg = respose.getMsg();
System.out.println("msg : " + msg);
}
}
});