设计模式:责任链模式

来源:互联网 发布:韩国高考 知乎 编辑:程序博客网 时间:2024/06/16 14:16

责任链模式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.csdn.net/detail/analyzesystem/9598016


Android源码中的责任链

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

小结

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

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

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

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

0 0
原创粉丝点击