设计模式之责任链模式
定义:
将能够处理同一类的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,处理或者传递给链上的下一个对象
场景:
1)公司里请假条的审批:
如果请假人数小于3天,主任审批;
如果请假人数大于等于3天,小于10天,经理审批;
如果请假人数大于等于10天,小于30天,总经理审批;
如果超过30天,拒绝请假
2)公司中报销单据流程
3)学校奖学金的评审
实例:公司请假条审批
LeaveRequest
/**
* 封装请假的基本信息
*/
package com.chainOfRespon;
public class LeaveRequest {
private String name;
private int leaveDays;
private String reason;
//构造器
public LeaveRequest(String name, int leaveDays, String reason) {
this.name = name;//名字
this.leaveDays = leaveDays;//请假天数
this.reason = reason;//请假原因
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLeaveDays() {
return leaveDays;
}
public void setLeaveDays(int leaveDays) {
this.leaveDays = leaveDays;
}
public String getReason() {
return reason;
}
public void setReason(String reason) {
this.reason = reason;
}
}
Leader
/**
* 抽象类
*/
package com.chainOfRespon;
public abstract class Leader {
protected String name;//领导人名字
protected Leader nextLeader;//责任链的后继对象
public Leader(String name) {
this.name = name;
}
/**
* 设置责任链的后继对象
*/
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
public abstract void handleResquest(LeaveRequest request);
}
Director
/**
* 主任
*/
package com.chainOfRespon;
public class Director extends Leader {
public Director(String name) {
super(name);
}
//处理请求的核心业务方法
@Override
public void handleResquest(LeaveRequest request) {
//如果请假天数少于3天,主任审批
if(request.getLeaveDays()<3) {
System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
System.out.println("主任"+this.name+"审批通过");
}else {
//超过3天,下一级领导人审批
if(this.nextLeader!=null) {
this.nextLeader.handleResquest(request);
}
}
}
}
Manager
/**
* 经理
*/
package com.chainOfRespon;
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
//处理请求的核心业务方法
@Override
public void handleResquest(LeaveRequest request) {
//如果请假天数少于10天,经理审批
if(request.getLeaveDays()<10) {
System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
System.out.println("经理"+this.name+"审批通过");
}else {
//超过10天,下一级领导人审批
if(this.nextLeader!=null) {
this.nextLeader.handleResquest(request);
}
}
}
}
GenerateManager
/**
* 总经理
*/
package com.chainOfRespon;
public class GenerateManager extends Leader {
public GenerateManager(String name) {
super(name);
}
//处理请求的核心业务方法
@Override
public void handleResquest(LeaveRequest request) {
//如果请假天数少于30天,总经理审批
if(request.getLeaveDays()<30) {
System.out.println("请假人:"+request.getName()+" 天数:"+request.getLeaveDays()+" 原因:"+request.getReason());
System.out.println("总经理"+this.name+"审批通过");
}else {
//超30三天
System.out.println("总经理"+this.name+"拒绝"+request.getName()+"请假");
}
}
}
Client
package com.chainOfRespon;
public class Client {
public static void main(String[] args) {
//创建三级领导人
Leader director = new Director("张三");
Leader manager = new Manager("里斯");
Leader generateManager = new GenerateManager("王五");
//组织责任链对象关系
director.setNextLeader(manager);
manager.setNextLeader(generateManager);
//创建请假信息
LeaveRequest request = new LeaveRequest("小小",10,"回家" );
//请假处理
director.handleResquest(request);
}
}
结果
请假人:小小 天数:10 原因:回家
总经理王五审批通过
链表方式定义职责链(上面实例)
非链表方式实现职责链(通过数组、集合生成职责链更加实用)
常见场景:
1)Java中异常机制,一个try可对应多个finally
2)JS中事件的冒泡和捕获机制,Java中事件处理使用的观察者模式
3)Servlet中,过滤器的链式处理