责任链模式:当客户提交请求时,请求会沿责任链传递,直至有一个对象负责处理它。当某个对象没有权限处理请求时,自动将处理转交上级
优点:请求者不用管是哪个对象处理,最终请求一定会被处理
实现:以普通员工申请请假和加薪为例,请假三天以内,经理处理;请假五天以内,加薪五百以内,总监处理;请假十天以内,加薪一千以内,大总监处理;请假超过十天,加薪超过一千,驳回申请
1、请求类
/*** 请求类*/public class Request {//请求方式private String requestType;//请求数量private Integer requestNumber;public String getRequestType() {return requestType;}public void setRequestType(String requestType) {this.requestType = requestType;}public Integer getRequestNumber() {return requestNumber;}public void setRequestNumber(Integer requestNumber) {this.requestNumber = requestNumber;}}
2、处理类
/*** 抽象管理者类*/public abstract class Manager {//名称String name;//上级管理者Manager superior;public Manager(String name){this.name = name;}/*** 设置上级管理者*/public abstract void setSuperior(Manager manager);public abstract void handleRequest(Request request);}/*** 经理*/public class CommonManager extends Manager{public CommonManager(String name){super(name);}/*** 设置上级管理者*/public void setSuperior(Manager manager){super.superior = manager;}/*** 有权限执行则执行,没有权限则向上提交*/public void handleRequest(Request request){if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 3){System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}else{System.out.println(MessageFormat.format("{0}:无权审批",name));superior.handleRequest(request);}}}/*** 总监*/public class Majordomo extends Manager{public Majordomo(String name){super(name);}/*** 设置上级管理者*/public void setSuperior(Manager manager){super.superior = manager;}/*** 有权限执行则执行,没有权限则向上提交*/public void handleRequest(Request request){if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 5){System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}else if ("加薪".equals(request.getRequestType()) && request.getRequestNumber() <= 500){System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}else{System.out.println(MessageFormat.format("{0}:无权审批",name));superior.handleRequest(request);}}}/*** 大总监*/public class GeneralManager extends Manager{public GeneralManager(String name){super(name);}/*** 设置上级管理者*/public void setSuperior(Manager manager){super.superior = manager;}/*** 有权限执行则执行,没有权限则驳回*/public void handleRequest(Request request){if ("请假".equals(request.getRequestType()) && request.getRequestNumber() <= 10){System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}else if ("加薪".equals(request.getRequestType()) && request.getRequestNumber() <= 1000){System.out.println(MessageFormat.format("{0}:通过申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}else{System.out.println(MessageFormat.format("{0}:驳回申请{1},数量{2}" ,name , request.getRequestType() , request.getRequestNumber()));}}}
3、测试类
/*** 测试责任链模式*/public class TestResponsibilityChain {public static void main(String [] args){Request request = new Request();request.setRequestType("请假");request.setRequestNumber(5);Manager commonManager = new CommonManager("张三经理");Manager majordomo = new Majordomo("李四总监");Manager generalManager = new GeneralManager("王五大总监");commonManager.setSuperior(majordomo);majordomo.setSuperior(generalManager);commonManager.handleRequest(request);}}
测试结果:
责任链模式是当系统中有大量分支判断时,需要用到的模式
