将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上对象逐个判断是否有能力处理请求,能就处理,不能就向上提交。
代码演示:
1.请假条请求类LeaveRequest :
/**
* 封装请假的基本信息
*/
public class LeaveRequest {
private String empName;
private int leaveDays;
private String season;
public LeaveRequest() {
}
public LeaveRequest(String empName, int leaveDays, String season) {
this.empName = empName;
this.leaveDays = leaveDays;
this.season = season;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getSeason() {
return season;
}
public void setSeason(String season) {
this.season = season;
}
}
2.抽象事物处理者,抽象类Leader :
public abstract class Leader {
protected String name;
/**
* 责任链上的后继对象
*/
protected Leader nextLeader;
public Leader(String name) {
this.name = name;
}
/**
* 设定责任链上的后继对象
* @param nextLeader
*/
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
/**
* 处理请求的核心业务方法
* @param request
*/
abstract void handleRequest(LeaveRequest request);
}
3.三个具体事物处理对象:
(1).主任对象Director
/**
* 主任对象
*/
public class Director extends Leader {
public Director(String name) {
super(name);
}
@Override
void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<3){
System.out.println("员工:"+request.getEmpName());
System.out.println("请假:"+request.getLeaveDays()+"天");
System.out.println("理由:"+request.getSeason());
System.out.println("主任:"+this.name+"通过");
}else {
if (this.nextLeader!=null){
this.nextLeader.handleRequest(request);
}
}
}
}
(2).经理对象Manager
/**
* 经理对象
*/
class Manager extends Leader {
public Manager(String name) {
super(name);
}
@Override
void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<10){
System.out.println("员工:"+request.getEmpName());
System.out.println("请假:"+request.getLeaveDays()+"天");
System.out.println("理由:"+request.getSeason());
System.out.println("经理:"+this.name+"通过");
}else {
if (this.nextLeader!=null){
this.nextLeader.handleRequest(request);
}
}
}
}
(3).总经理对象GeneraManager
/**
* 总经理
*/
class GeneraManager extends Leader{
public GeneraManager(String name) {
super(name);
}
@Override
void handleRequest(LeaveRequest request) {
if (request.getLeaveDays()<30){
System.out.println("员工:"+request.getEmpName());
System.out.println("请假:"+request.getLeaveDays()+"天");
System.out.println("理由:"+request.getSeason());
System.out.println("总经理:"+this.name+"通过");
}else {
System.out.println("莫非:"+request.getEmpName()+"不想干了?");
}
}
}
4.测试
public class App {
public static void main(String[] args) {
Leader director =new Director("张三");
Leader manager =new Manager("李四");
Leader generaManager=new GeneraManager("王五");
//组织责任链对象关系
director.setNextLeader(manager);
manager.setNextLeader(generaManager);
//开始请假
LeaveRequest request=new LeaveRequest("罗翔",11,"去b站直播");
director.handleRequest(request);
}
}
结果:员工:罗翔
请假:11天
理由:去b站直播
总经理:王五通过
应用场景:异常捕捉,servelet中过滤器。