Android面试题--设计模式之责任链模式的通俗易懂实现及使用场景

责任链模式

  • 责任链模式
  • 实现
    • 责任人
    • 链的实现
    • 责任人的实现
    • 客户端调用
  • 责任链模式使用场景

责任链模式

将请求者与接收者进行解耦,在其中插入多个对象,每个对象都可以处理该请求,将这些对象连成一条链,并将请求在这条链上传递,直到有一个对象处理该请求为止,这就是责任链模式

实现

需要实现的需求是:网络请求

某种业务场景下需要发送网络请求,向服务器获取结果;这里有个网络请求工具类,可以直接调用它的方法;但是每次网络请求前都需要判断网络状态,是否需要使用缓存等因素,同时为了增加代码可维护性,避免代码耦合,这里就可以使用责任链模式进行解耦;比如将判断网络状态定义为一个责任人,缓存判断定义为一个责任人,真正执行网络请求定义为一个责任人

既然是责任链,那肯定需要有一条将多个责任人连接起来的链条,以接口的形式定义一个链

/**
 * Author:mango
 * Time: 2019/4/9 14:59
 * Desc: TODO(责任链接口)
 */
public interface Chain {

    /**
     * 取出下一个责任人执行任务
     * @return
     */
    Object nextResolve();
}

责任人

接下来就是真正进行任务处理的对象了,定义一个接口

/**
 * Author:mango
 * Time: 2019/4/9 14:55
 * Desc: TODO(中间业务处理对象接口)
 */
public interface Resolve {

    /**
     * 履行自己的责任
     * 执行相应的任务
     * @param chain
     * @return
     */
    Object resolveResquest(Chain chain);
}

链的实现

/**
 * Author:mango
 * Time: 2019/4/9 17:48
 * Desc: TODO(责任链实现类)
 */
public class ChainImpl implements Chain {

    private List resolveList = new ArrayList<>();

    private int index;

    public ChainImpl(int index) {
        this.index = index;
    }

    public void addResolve(Resolve resolve){
        resolveList.add(resolve);
    }

    @Override
    public Object nextResolve() {

        Resolve resolve = resolveList.get(index++);
        Object o = resolve.resolveResquest(new ChainImpl(index));
        return o;
    }
    
}

内部维护了一个集合,保存每个责任人,然后依次取出每个责任人去执行它们自己的任务

责任人的实现

这里有三个实现

/**
 * Author:mango
 * Time: 2019/4/9 17:35
 * Desc: TODO(中间业务 负责网络状态处理的责任人)
 */
public class NetStateResolve implements Resolve {

    @Override
    public Object resolveResquest(Chain chain) {

        /**
         * 这里可以进行网络判断
         * 比如是否连接了网络
         * 比如连接的是数据网络还是wifi
         * 如果网络不正常就return
         */

        /**
         * 如果网络正常,就执行下一个
         */
        Object o = chain.nextResolve();

        return o;
    }

}

该责任人负责网络状态的判断,以绝对是否需要执行下一步操作

/**
 * Author:mango
 * Time: 2019/4/9 17:35
 * Desc: TODO(中间业务 负责缓存处理的责任人)
 */
public class CacheResolve implements Resolve {


    @Override
    public Object resolveResquest(Chain chain) {

        /**
         * 这里可以获取缓存
         * 如果缓存有效就直接返回,不需要下一个责任人处理
         */


        /**
         * 如果我处理不了,也就是没有缓存
         * 那就交给下一个责任人处理
         */
        Object o = chain.nextResolve();

        return o;
    }
    
}

该责任人是负责缓存的处理,有缓存就可以使用缓存

/**
 * Author:
 * Time: 2019/4/22 14:54
 * Desc: TODO(网络请求)
 */
public class NetWorkResolve implements Resolve {

    @Override
    public Object resolveResquest(Chain chain) {

        Object o ;

        /**
         * 这里就是进行真正的网络请求了
         * 获取结果并返回
         */

        o = HttpRequest.get();

        return o;
    }

}

该责任人负责执行网络请求获取数据,这里就是责任链最后一步

public class HttpRequest {

    public static Object get(){
        return new Object();
    }
}

客户端调用

  ChainImpl chain = new ChainImpl(0);
  chain.addResolve(new NetStateResolve());
  chain.addResolve(new CacheResolve());
  chain.addResolve(new NetWorkResolve());
  
  chain.nextResolve();

责任链模式使用场景

  • 一个请求需要一系列的操作,比如上面的网络请求
  • 工作流的处理,比如需求审批,部门某个人提出聚餐,费用需要经过项目经理、部门经理、总经理之中的某一位领导或者所有领导进行审批

你可能感兴趣的:(【Java开发与设计模式】)