责任链模式
定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
假如规定学生请假小于或等于 2 天,班主任可以批准;小于或等于 7 天,系主任可以批准;小于或等于 10 天,院长可以批准;其他情况不予批准;
代码如下:
public class ChainOfResponsibilityTest {
public static void main(String[] args) {
Leader leader1 = new ClassAdviser();
Leader leader2 = new DepartmentHead();
Leader leader3 = new Dean();
leader1.setNext(leader2);
leader2.setNext(leader3);
// 不同天数请假验证
for (int i = 0; i < 11; i++) {
leader1.handleRequest(i + 1);
}
}
}
// 领导类
abstract class Leader {
private Leader next;
public Leader getNext() {
return next;
}
public void setNext(Leader next) {
this.next = next;
}
//处理请求的方法
public abstract void handleRequest(int days);
}
// 班主任
class ClassAdviser extends Leader {
@Override
public void handleRequest(int days) {
if (days <= 2) {
System.out.println("班主任批准假期" + days + "天");
} else {
if (getNext() == null) {
System.out.println("请假天数太长,不批准");
} else {
getNext().handleRequest(days);
}
}
}
}
// 系主任
class DepartmentHead extends Leader {
@Override
public void handleRequest(int days) {
if (days <= 7) {
System.out.println("系主任批准假期" + days + "天");
} else {
if (getNext() == null) {
System.out.println("请假天数太长,不批准");
} else {
getNext().handleRequest(days);
}
}
}
}
// 系主任
class Dean extends Leader {
@Override
public void handleRequest(int days) {
if (days <= 10) {
System.out.println("院长批准假期" + days + "天");
} else {
if (getNext() == null) {
System.out.println("请假天数太长,不批准");
} else {
getNext().handleRequest(days);
}
}
}
}
参考资料:
1.http://c.biancheng.net/view/1383.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git