1. 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2. 示例: 以公司请假审批为例,审批需要部门经理、总监、老板依次审批,最终审批人由实际请假天数而定。
/**
* @author beck.yang
* @date 2022/7/5 16:26
* @description
*/
public class Request {
private String type;
private int number;
private String name;
public Request(String type, int number, String name) {
this.type = type;
this.number = number;
this.name = name;
}
public String getType() {
return type;
}
public int getNumber() {
return number;
}
public String getName() {
return name;
}
}
/**
* @author beck.yang
* @date 2022/7/5 15:51
* @description
*/
public abstract class Manager {
protected String name;
// 上级
protected Manager superManager;
public Manager(String name){
this.name = name;
}
public void setSuperManager(Manager superManager) {
this.superManager = superManager;
}
public abstract void checkRequest(Request request);
}
/**
* @author beck.yang
* @date 2022/7/5 16:31
* @description 部门经理
*/
public class DepartmentManager extends Manager {
public DepartmentManager(String name) {
super(name);
}
@Override
public void checkRequest(Request request) {
if ("请假".equals(request.getType()) && request.getNumber() <= 3) {
System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
} else {
if (superManager != null) {
superManager.checkRequest(request);
}
}
}
}
/**
* @author beck.yang
* @date 2022/7/5 16:31
* @description 总监
*/
public class Director extends Manager {
public Director(String name) {
super(name);
}
@Override
public void checkRequest(Request request) {
if ("请假".equals(request.getType()) && request.getNumber() <= 5) {
System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
} else {
if (superManager != null) {
superManager.checkRequest(request);
}
}
}
}
/**
* @author beck.yang
* @date 2022/7/5 16:39
* @description 老板
*/
public class Boss extends Manager{
public Boss(String name) {
super(name);
}
@Override
public void checkRequest(Request request) {
if ("请假".equals(request.getType()) && request.getNumber() <= 10) {
System.out.println(String.format("%s批准%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
} else {
// 老板需要处理全部
System.out.println(String.format("%s拒绝%s%s%d天", name, request.getName(), request.getType(), request.getNumber()));
}
}
}
/**
* @author beck.yang
* @date 2022/7/5 15:51
* @description 责任链模式
*/
public class Main {
public static void main(String[] args) {
DepartmentManager departmentManager = new DepartmentManager("部门经理");
Director director = new Director("总监");
Boss boss = new Boss("大老板");
departmentManager.setSuperManager(director);
director.setSuperManager(boss);
Request request = new Request("请假",3,"张三");
departmentManager.checkRequest(request);
Request request2 = new Request("请假",4,"张三");
departmentManager.checkRequest(request2);
Request request3 = new Request("请假",8,"张三");
departmentManager.checkRequest(request3);
Request request4 = new Request("请假",12,"张三");
departmentManager.checkRequest(request4);
}
}