什么时候需要用到责任链模式
处理事情的对象是先后顺序的。编程中最明显的就是三级缓存,一般,你会先查询内存数据,没有数据再看硬盘数据,再没有数据,则请求网络数据。这里很明显的就是一个个的进行处理。某个对象没有能力处理则把处理权交给另外的对象。
类图
想要行为一个完整的链,需要有一个设置下一级的能力,类图中需要体现这点
类图倒是很简单的
代码
//接口部分
public interface Loader {
//这是基本功能
public String getUrl();
public void setUrl(String url);
//这是设置下一级的责任人
public void setNext(Loader loader);
}
public class LocalLoader implements Loader{
private String url;
private Loader next;
@Override
public String getUrl() {
// TODO Auto-generated method stub
if (url != null) {
return url;
}
return next.getUrl();
}
@Override
public void setNext(Loader loader) {
// TODO Auto-generated method stub
next = loader;
}
public void setUrl(String url) {
this.url = url;
}
}
//网络的加载
public class NetLoader implements Loader{
private String url;
private Loader next;
@Override
public String getUrl() {
// TODO Auto-generated method stub
if (url != null) {
return url;
}
return next.getUrl();
}
@Override
public void setNext(Loader loader) {
// TODO Auto-generated method stub
next = loader;
}
public void setUrl(String url) {
this.url = url;
}
}
调用
//手动的设置下一级的处理人是谁,可以在调用时进行指定,非常的灵活
Loader loader = new CachedLoader();
Loader loadernext = new LocalLoader();
loadernext.setNext(new NetLoader());
loader.setNext(loadernext);
loader.setUrl("test");
loader.getUrl();
Log.d("第一级责任人有处理 "+loader.getUrl());
//改变条件然后再去获取值
loader.setUrl(null);
loadernext.setUrl("test2");
Log.d("第一级责任人没有处理 "+loader.getUrl());
为了更好的查看,以代码的方式进行了记录.详情请查看DesignPattern中的 com.arron.pattern.dutychain下的内容.戳我查看详情