在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。
需求:员工请假一天 主管审批, 请假2-3天 经理审批,请假3-30 天cto审批, 大于30不通过
public abstract class AbstractHandler {
protected AbstractHandler nextHandler;
void setNextHandler(AbstractHandler abstractHandler){
this.nextHandler = abstractHandler;
}
abstract void handle(int days);
}
class DirectorIHandler extends AbstractHandler{
@Override
void handle(int days) {
if (days >= 0 && days <= 1) {
System.out.println("请假1天, 主管审批,请假成功");
}else {
System.out.println("请假"+days+"天, 主管级别不够");
this.nextHandler.handle(days);
}
}
}
class ManagerIHandler extends AbstractHandler{
@Override
void handle(int days) {
if (days >= 2 && days <= 3) {
System.out.println("请假大于3天, 经理审批,请假成功");
}else {
System.out.println("请假大于3天, 经理级别不够,由cto审批");
this.nextHandler.handle(days);
}
}
}
class CTOIHandler extends AbstractHandler{
@Override
void handle(int days) {
if (days > 3 && days < 30) {
System.out.println("请假大于3天, 经理审批,请假成功");
}else {
System.out.println("请假天数太多,不通过");
}
}
}
public static void main(String[] args) {
DirectorIHandler directorIHandler = new DirectorIHandler();
ManagerIHandler managerIHandler = new ManagerIHandler();
CTOIHandler ctoiHandler = new CTOIHandler();
directorIHandler.setNextHandler(managerIHandler);
managerIHandler.setNextHandler(ctoiHandler);
directorIHandler.handle(30);
}
执行结果:
方式2:
import java.util.ArrayList;
import java.util.List;
public interface IHandler {
boolean handle(int days);
}
// 员工请假一天 主管审批
// 请假2-3天 经理审批
// 请假3-5 天cto审批
// 主管
class DirectorHandler implements IHandler{
@Override
public boolean handle(int days) {
if (days >= 0 && days <= 1) {
System.out.println("请假1天, 主管审批,请假成功");
return true;
}
System.out.println("请假"+days+"天, 主管级别不够");
return false;
}
}
// 经理
class ManagerHandler implements IHandler{
@Override
public boolean handle(int days) {
if (days >= 2 && days <= 3) {
System.out.println("请假2-3天, 经理审批,请假成功");
return true;
}
System.out.println("请假"+days+"天, 经理级别不够");
return false;
}
}
// CTO
class CTOHandler implements IHandler{
@Override
public boolean handle(int days) {
if (days > 3 && days < 30) {
System.out.println("请假大于3天, 经理审批,请假成功");
return true;
}
System.out.println("请假天数太多,不通过");
return false;
}
}
class IHandlerChain{
IHandler iHandler;
List<IHandler> iHandlerList = new ArrayList<>();
public void setiHandler(IHandler iHandler){
this.iHandler = iHandler;
}
public void addIHandler(IHandler iHandler){
if (iHandler != null) {
iHandlerList.add(iHandler);
}
}
public void run(int days){
for (IHandler handler : iHandlerList) {
if (handler.handle(days)) {
return;
}
}
}
}
执行结果:
应用举例: Servlet Filter、Spring Interceptor, 敏感词过滤