职责链模式:
1.觉得学过的东西如果不记下来就太浪费了,还会经常忘掉,于是乎开始写博客。我只是一个菜鸟程序员,但有一颗向往技术大牛的心。
2.职责链模式:当一个问题需要经过“重重考虑”才能给出结果时,这样的“重重考虑”的过程,需要用到职责链模式。职责链模式中,有多个负责不同职责的handler,当handlerA解决不了问题时,会交给handlerB,而如果handlerB也不能解决时,就会交给handlerC····以此类推,直到最后一个handler。
Handler : 责任人的父类
ConcreteHandler:责任人的具体类
3.例子: 学生要向学校请假,如果请假天数<3天,只需要老师批准,而3天<请假天数<7天则需要级长批准,7天以上的请假需要校长批准,这时候需要用到职责链模式。
首先新建一个Handler类,所有处理问题的人都是Handler的子类
package pers.reus.model.handler.impl;
public abstract class Handler {
//创建职责链的连接者
protected Handler successor = null;
//设置下一个处理的对象
public void setSuccessor(Handler successor){
this.successor = successor;
}
//获得下一个处理对象
public Handler getSuccessor(){
return successor;
}
/**
* 处理学生请假的方法
* student 学生姓名
* day 请假天数
* **/
public abstract String HandlerRequest(String student, int day);
}
接下来分别创建 教师,级长,校长 三种责任人,他们都继承Handler
教师:
package pers.reus.model.handler;
import pers.reus.model.handler.impl.Handler;
public class Teacher extends Handler {
public String HandlerRequest(String student, int day){
//处理请假结果以String返回
String msg = null;
//请假少于3天,只需老师同意
if(day <= 3){
msg = "老师同意 " + student + " 请假 " + day + " 天";
}else{
//当存在下一个处理对象时,老师处理不了的请假交由下一个对象处理
if(getSuccessor() != null){
System.out.println("老师无权同意 " + student + " 请假 " + day + " 天");
return getSuccessor().HandlerRequest(student,day);
}
}
//返回请假结果
return msg;
}
}
级长:
package pers.reus.model.handler;
import pers.reus.model.handler.impl.Handler;
public class Prefect extends Handler{
public String HandlerRequest(String student, int day) {
//处理请假结果以String返回
String msg = null;
//请假少于7天,只需级长同意
if(day <= 7){
msg = "级长同意 " + student + " 请假 " + day + " 天";
}else{
//当存在下一个处理对象时,级长处理不了的请假交由下一个对象处理
if(getSuccessor() != null){
System.out.println("级长无权同意 " + student + " 请假 " + day + " 天");
return getSuccessor().HandlerRequest(student,day);
}
}
//返回请假结果
return msg;
}
}
校长:
package pers.reus.model.handler;
import pers.reus.model.handler.impl.Handler;
public class SchoolMaster extends Handler{
public String HandlerRequest(String student, int day) {
//处理请假结果以String返回
String msg = null;
//请假大于7天,需要校长同意
if(day > 7){
msg = "校长同意 " + student + " 请假 " + day + " 天";
}else{
//当存在下一个处理对象时,校长处理不了的请假交由下一个对象处理
if(getSuccessor() != null){
System.out.println("校长无权同意 " + student + " 请假 " + day + " 天");
return getSuccessor().HandlerRequest(student,day);
}
}
//返回请假结果
return msg;
}
}
最后,创建client类测试:
package pers.reus.model.client;
import pers.reus.model.handler.Prefect;
import pers.reus.model.handler.SchoolMaster;
import pers.reus.model.handler.Teacher;
import pers.reus.model.handler.impl.Handler;
public class Client {
public static void main(String[] args) {
//创建 教师,级长,校长 三个类
Handler teacher = new Teacher();
Handler prefect = new Prefect();
Handler schoolMaster = new SchoolMaster();
//设置责任关系,教师无法处理交给级长,级长无法处理交给校长
teacher.setSuccessor(prefect);
prefect.setSuccessor(schoolMaster);
//模拟学生进行请假
String str = teacher.HandlerRequest("小明",8);
//输出请假结果
System.out.println(str);
}
}