设计模式:责任链模式
来源:互联网 发布:韩国高考 知乎 编辑:程序博客网 时间: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,事件不再继续分发,具体不细解,有兴趣可以查阅源码。如果源码看着比较生涩可以参考源码设计模式一书对照观看。
小结
本篇相对比较草,做个学习记录吧
设计模式虽多,开发不一定都用,即使有地方能用到也可能不用,需要考虑程序的维护和人才交替的成本,以及链式的递归调用带来的性能问题。
设计模式虽然也有缺点,我们不能放大缺点忽略其可取之处,即使你不用也还是可以学习了解的
这都是精华,精华,精华你懂得!!!
- 责任链设计模式
- 责任链设计模式
- 设计模式---责任链
- 责任链设计模式
- 设计模式----责任链
- 设计模式-责任链
- 责任链设计模式
- 责任链设计模式
- 设计模式:责任链
- [设计]责任链模式
- 设计模式--责任链
- 责任链设计模式
- 设计模式----责任链模式
- 【设计模式】责任链模式
- 设计模式---责任链模式
- 设计模式:责任链模式
- 设计模式--责任链模式
- 设计模式---责任链模式
- 使用break直接结束外层循环
- 7种形式的Android Dialog使用举例
- 文章标题
- linux与php学习杂记
- 模型dict打印输出@property
- 设计模式:责任链模式
- linux2.6.31在TX2440A上的移植
- Curl 的使用之调用接口
- hdu 4616 Game (树形dp)
- 项目中遇到的问题
- ajax中的同步与异步
- 1/n循环节长度
- 日心说和地心说
- js 正则匹配