设计模式:责任链模式

责任链模式Simple

责任链模式没啥好说的,还是看图说话吧

上图为一个稍微牵强的责任链模式运用,在Android开发中涉及到第三方登录的这块的应用会有用到这方面的知识,登录流程一般为用户请求登录,服务器直接给出响应,当调用第三放登录不会直接返回响应,还会通过第三方得到的token去服务器登录(注册)才能返回用户信息(当然给用户展现出来的只有一个进度而已)。由于上图展示的可能你觉得比较牵强,那么接着看下图更详尽的梳理了责任链模式相关的知识。

上图是一个休假审批相关UML,每个人都具有请假权限,leader还具有审批权限,审批流程当leader无权审批就想上级提出请求。接下来写个demo实践。

首先第一点,在编写代码遇到个问题,Gradle编译时出现: 编码GBK的不可映射字符,解决办法:

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

编写基类Worker


public class Worker {

    private int days;

    public Worker() {

    }

    public Worker(int days) {
        vacate(days);
    }

    public int getVacateDays() {
        return days;
    }

    public void vacate(int days) {
        this.days = days;
    }

    public void request(Worker worker, AbsLeader absLeader, IVacateListener listener) {
        absLeader.approval(worker, listener);
    }

}

抽象Leader类


   public abstract class AbsLeader extends Worker {

    public void approval(Worker worker,IVacateListener listener){
        if(worker.getVacateDays()>approvalMaxDays()){
            System.out.println(getClass().getSimpleName()+"回复:休假日期" + worker.getVacateDays() + "天,超出了我的审批范围,正在转交上级审批中..");
            request(worker,getLeader(),listener);
        }else{
            listener.onSuccess();
        }
    }

    public abstract int approvalMaxDays();

    public abstract AbsLeader getLeader();
   }

测试员工类StaffWorker不做任何修改,CTO 、CEO类区别在于重载方法修改审批


public class CEOLeader extends AbsLeader {

    @Override
    public int approvalMaxDays() {
        return 10;
    }

    @Override
    public AbsLeader getLeader() {
        return null;
    }

    @Override
    public void approval(Worker worker, IVacateListener listener) {
        if(worker.getVacateDays()>approvalMaxDays()){
            listener.onFail("CEO回复:我去你妹哦,不想干了赶紧滚蛋");
        }else{
            listener.onSuccess();
        }
    }
}

其他代码大致雷同不再贴码,下面是测试类和测试结果

public static void main(String[] arg0){
        StaffWorker staffWorker = new StaffWorker(11);
        staffWorker.request(staffWorker,new DepartmentLeader(), new IVacateListener() {
            @Override
            public void onSuccess() {
            System.out.println("假期玩得愉快!");
            }

            @Override
            public void onFail(String message) {
                System.out.println(message);
            }
        });
    }
   //..........................下面是测试结果...................................

DepartmentLeader回复:休假日期11天,超出了我的审批范围,正在转交上级审批中..
PMLeader回复:休假日期11天,超出了我的审批范围,正在转交上级审批中..
CTO回复:休假日期11天,超出了我的审批范围,正在转交上级审批中..
CTO回复:小伙子请假需慎重!
CEO回复:我去你妹哦,不想干了赶紧滚蛋

Process finished with exit code 0

上述举例代码simple在这里:http://download.youkuaiyun.com/detail/analyzesystem/9598016


Android源码中的责任链

ViewGroup的dispatchTouchEvent用于触摸事件的分发,如果消费了事件,onTouch返回true,事件不再继续分发,具体不细解,有兴趣可以查阅源码。如果源码看着比较生涩可以参考源码设计模式一书对照观看。

小结

本篇相对比较草,做个学习记录吧

  • 设计模式虽多,开发不一定都用,即使有地方能用到也可能不用,需要考虑程序的维护和人才交替的成本,以及链式的递归调用带来的性能问题。

  • 设计模式虽然也有缺点,我们不能放大缺点忽略其可取之处,即使你不用也还是可以学习了解的

  • 这都是精华,精华,精华你懂得!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值