我眼中的责任链模式

什么时候需要用到责任链模式

处理事情的对象是先后顺序的。编程中最明显的就是三级缓存,一般,你会先查询内存数据,没有数据再看硬盘数据,再没有数据,则请求网络数据。这里很明显的就是一个个的进行处理。某个对象没有能力处理则把处理权交给另外的对象。

类图

想要行为一个完整的链,需要有一个设置下一级的能力,类图中需要体现这点

类图倒是很简单的
责任链

代码

//接口部分
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下的内容.戳我查看详情

猜你喜欢

转载自blog.csdn.net/xjz729827161/article/details/78229581
今日推荐