责任链
责任链又叫做职责链,是属于行为型设计模式,它的初衷是为了解决一个事件需要经过多个对象处理是很常见的场景。
一个例子
说责任链之前,先引入一个场景,假如规定学生请假小于或等于 2 天,班主任可以批准;小于或等于 7 天,系主任可以批准;小于或等于 10 天,院长可以批准;其他情况不予批准;以此为需求,写一个程序,你会怎么做?按着过程思维方式,最快最直白的就是,if else嘛,配合java,无非多追加学生类和各个角色的类。下面介绍的设计模式或许会给我们一些启发。
public class ResponseChain { public static void main(String[] args) { leader headMaster = new HeadMaster(); leader classHeader = new classHeader(); leader dean = new dean(); headMaster.setNext(classHeader); classHeader.setNext(dean); headMaster.handlerRequest(2); headMaster.handlerRequest(6); headMaster.handlerRequest(8); } static abstract class leader{ private leader next; public leader getNext() { return next; } public void setNext(leader next) { this.next = next; } public abstract void handlerRequest(int days); } static class HeadMaster extends leader{ @Override public void handlerRequest(int days) { if(days <= 2){ System.out.println("班主任审批通过,请假+" + days); }else { if(this.getNext() != null){ this.getNext().handlerRequest(days); } else { System.out.println("请假天数过多,班主任无法审批"); } } } } static class classHeader extends leader{ @Override public void handlerRequest(int days) { if(days <= 7){ System.out.println("系主任审批通过,请假+" + days); }else { if(this.getNext() != null){ this.getNext().handlerRequest(days); } else { System.out.println("请假天数过多,系主任无法审批"); } } } } static class dean extends leader{ @Override public void handlerRequest(int days) { if(days <= 10){ System.out.println("院长审批通过,请假+" + days); }else { if(this.getNext() != null){ this.getNext().handlerRequest(days); } else { System.out.println("请假天数过多,院长无法审批"); } } } } }