责任链模式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,事件不再继续分发,具体不细解,有兴趣可以查阅源码。如果源码看着比较生涩可以参考源码设计模式一书对照观看。
小结
本篇相对比较草,做个学习记录吧
设计模式虽多,开发不一定都用,即使有地方能用到也可能不用,需要考虑程序的维护和人才交替的成本,以及链式的递归调用带来的性能问题。
设计模式虽然也有缺点,我们不能放大缺点忽略其可取之处,即使你不用也还是可以学习了解的
这都是精华,精华,精华你懂得!!!