责任链模式:当客户提交请求时,请求会沿责任链传递,直至有一个对象负责处理它。当某个对象没有权限处理请求时,自动将处理转交上级
优点:请求者不用管是哪个对象处理,最终请求一定会被处理
实现:以普通员工申请请假和加薪为例,请假三天以内,经理处理;请假五天以内,加薪五百以内,总监处理;请假十天以内,加薪一千以内,大总监处理;请假超过十天,加薪超过一千,驳回申请
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);
}
}
测试结果:
责任链模式是当系统中有大量分支判断时,需要用到的模式