例子:比如:A要去买房,找中介。中介卖给A一套房。
开始分析
1.中介里肯定有一个对象把房卖给了A,暂且定义这个真正卖房给A的人叫B;
2.中介和B都有一个职能,就是卖房;所以抽象出来的接口中 就有了一个 卖房的方法;
3.中介和B 都实现了这个接口
4.中介中实现这个接口的方法肯定是调的B的方法。
5.所以中介这个类中 应该含有一个B的对象,因为B实现了接口,所以应该定义一个接口类型的属性。
6.属性提供一个设置值的方法,这样可以动态的改变交易的对象。
7.A不关心到底中介找的谁要的房子,他只要达到买房的目的就行了。
缺点:如果接口方法需要扩展,那么所有实现类都要更改
优点:切换同一级别的真实实现类,很方便。一般的网络请求、图片加载由于框架层出不穷,通过此方法,可以达到不同框架的完美切换
如下附赠:网络框架切换
public interface ICallBack {
void OnSuccess(String result);
void OnFailure(String fail);
}
// 请求完成后回调部分对于返回值的处理类
public abstract class HttpCallBack<T> implements ICallBack {
@Override
public void OnSuccess(String result) {
Class<?> clz = analysisClassInfo(this);
T o = (T) GsonUtil.getInstance().fromJson(result, clz);
onSuc(o);
}
public abstract void onSuc(T t);
// 反射拿到当前类的泛型class
// 方便gson转换
private Class<?> analysisClassInfo(Object o) {
Type type = o.getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
return (Class<?>) actualTypeArguments[0];
}
@Override
public void OnFailure(String fail) {
}
}
// 抽取公共部分
public interface IHttpProcessor {
void post(String url, HashMap<String, Object> params, ICallBack iCallBack);
}
// 静态代理模式
public class HttpHelper implements IHttpProcessor {
private static HttpHelper httpHelper = new HttpHelper();
// 拥有一个代理对象,所有公共接口实现均有代理对象实现
private static IHttpProcessor iHttpProcessor;
private HttpHelper(){}
public static HttpHelper getInstance(){
return httpHelper;
}
// 方便不同网络框架切换
public static void init(IHttpProcessor httpProcessor) {
iHttpProcessor = httpProcessor;
}
@Override
public void post(String url, HashMap<String, Object> params, ICallBack iCallBack) {
iHttpProcessor.post(url,params,iCallBack);
}
// 具体网络框架
public class VolleyProcessor implements IHttpProcessor {
@Override
public void post(String url, HashMap<String, Object> params, ICallBack iCallBack) {
}
}
最后在整个app运行的初始化阶段 通过 HttpHelper.init(new VolleyProcessor());设置当前的网络框架。当然也可以实现 retrofit、okhttp、okgo等 进行快速切换