这个时候如果有个封装好的网络缓存框架,我们只需要添加一个参数就可以完成缓存机制了啊!于是在7.11发完版,我就在着手研究这件事了。
###网络缓存框架结构
贴张图来更直观地感受下。
对于这样一个需求,如果设计程序才能具有良好的扩展性呢?我们是不是要直接写一个工具类去控制Cache存取和网络请求呢?如果这样那以后要是想修改一下缓存机制和网络框架都需要改动这个工具类,这也就违背了“开闭原则”。
其实这样一个场景是一个设计模式典型的应用场景:代理模式。代理模式能很好地隔离使用和具体实现,对修改封闭,对扩展开放。
###具体实现
代码可以分为三个部分:callback主要负责接口回调,controller作为代理类控制缓存和网络框架的实现,processor作为具体实现类。
我们先来看下IProcess接口
public interface IProcess {
void send(String url, Map<String, Object> params, ICallback callback);
}
这里提供了一个请求方法,不管请求网络还是获取缓存都调用这个方法。
接下来看CacheProcesser和NetworkProcessor的实现
public class CacheProcessor implements IProcess {
@Override
public void send(String url, Map<String, Object> params, ICallback callback) {
}
}
public class NetworkProcessor implements IProcess {
@Override
public void send(String url, Map<String, Object> params, ICallback callback) {
}
}
这里只是提供了一个框架,具体缓存实现和网络实现还没有写。不过缓存可以直接用ACache或是LruCache,网络请求可以直接用okhttp或retrofit。这里就不详细写了。
接下来看ICallback的实现
interface ICallback {
fun onSuccessCall(result: String, fromNetwork: Boolean)
fun onFailureCall(e: String, fromNetwork: Boolean)
}
这里提供请求成功和失败的接口回调。为了程序的扩展性,我们还需要有一个抽象类来实现这个ICallback。在这里我们就可以写一些业务逻辑,比如在网络请求回来后我们可以将网络请求数据和本地缓存数据进行对比,如果不一样再回调。
public abstract class CacheNetworkCallback implements ICallback {
@Override
public void onSuccessCall(@NotNull String result, boolean fromNetwork) {
onSuccess(result, fromNetwork);
}
@Override
public void onFailureCall(@NotNull String e, boolean fromNetwork) {
onFailure(e, fromNetwork);
}
public abstract void onSuccess(@NotNull String result, boolean fromNetwork);
public abstract void onFailure(@NotNull String e, boolean fromNetwork);
}
接下来就是代理类了,它控制缓存机制和网络请求的调用时机。
public class NetworkCacheManager implements IProcess {
private static NetworkCacheManager instance;
private Type mType;
public static NetworkCacheManager getInstance(Type type) {
if (instance == null) {
instance = new NetworkCacheManager(type);
}
return instance;
}
public NetworkCacheManager(Type type) {
mType = type;
}
@Override
public void send(String url, Map<String, Object> params, ICallback callback) {
switch (mType) {
case net:
mNetworkProcessor.send(url, params, callback);
break;
case cache:
mCacheProcessor.send(url, params, callback);
break;
case both:
mCacheProcessor.send(url, params, callback);
mNetworkProcessor.send(url, params, callback);
break;
}
}
private CacheProcessor mCacheProcessor = new CacheProcessor();
private NetworkProcessor mNetworkProcessor = new NetworkProcessor();
}
相信读到这里你应该已经了解了我的设计思想了吧。这里留下**demo地址**,欢迎下载体验。