定义
- 将能够处理同一请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
责任链模式角色
- 抽象处理器(handler): 定义了处理器的处理方法,并维护了下一个处理器对象的引用;
- 具体处理器(ConcreteHandler): 实现了抽象处理器的处理方法,并确定了当前处理器是否可以处理,如果不能处理,就将请求交给下一个处理器处理;
场景
- 打牌时,轮流出牌
- 接力赛跑
- 大学中,奖学金审批
- 公司中,公文审批
- 公司中,请假审批
开发中常见的场景
- java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch。
- servlet开发中,过滤器的链式处理。
- struts2中,拦截器的调用也是经典的责任链模式;
公司里面,请假条的审批流程
- 如果请假天数小于3天,主任审批;
- 如果请假天数大于等于3天,小于7天,经理审批;
- 如果大于等于7天,小于30天,总经理审批;
- 如果大于30天,提示拒绝。
代码实现
- 封装请假的基本信息
java
/**
* 封装请假的基本信息
*/
public class LeaveRequest {
//请假对象
private String name;
//请假多次时间
private int LeaveDays;
//请假理由
private String reason;
public LeaveRequest(String name, int leaveDays, String reason) {
super();
this.name = name;
this.LeaveDays = leaveDays;
this.reason = reason;
}
public String getName() {
return name;
}
public int getLeaveDays() {
return LeaveDays;
}
public String getReason() {
return reason;
}
public void setName(String name) {
this.name = name;
}
public void setLeaveDay(int leaveDays) {
LeaveDays = leaveDays;
}
public void setReason(String reason) {
this.reason = reason;
}
}
- 抽象处理器(handler)
java
/**
* 抽象类 责任链对象
*/
public abstract class Leader {
// 当前责任链对象名称
protected String name;
//责任链上的后继对象
protected Leader nextLeader;
public Leader(String name) {
super();
this.name=name;
}
/**
* 设定责任链上的后继对象
* @param nextLeader
*/
public void setNextLeader(Leader nextLeader) {
this.nextLeader = nextLeader;
}
/**
* 处理请求的核心的业务抽象方法
* @param request
*/
public abstract void HandleReques(LeaveRequest request);
}
- 具体处理器(ConcreteHandler)
java
/**
* 主任
*/
public class Director extends Leader{
public Director(String name) {
super(name);
}
@Override
public void HandleReques(LeaveRequest request) {
if(request.getLeaveDays()<3){
System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("主任"+this.name+"给予"+request.getName()+"请假审批通过!");
}else{
if(null!=this.nextLeader){
this.nextLeader.HandleReques(request);
}
}
}
}
/**
* 经理
*/
public class Manager extends Leader{
public Manager(String name) {
super(name);
}
@Override
public void HandleReques(LeaveRequest request) {
if(request.getLeaveDays()<7){
System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("经理"+this.name+"给予"+request.getName()+"请假审批通过!");
}else{
if(null!=this.nextLeader){
this.nextLeader.HandleReques(request);
}
}
}
}
/**
* 总经理
*/
public class GeneralManager extends Leader{
public GeneralManager(String name) {
super(name);
}
@Override
public void HandleReques(LeaveRequest request) {
if(request.getLeaveDays()<30){
System.out.println("员工"+request.getName()+"请假,天数:"+request.getLeaveDays()+",理由:"+request.getReason());
System.out.println("总经理"+this.name+"给予"+request.getName()+"请假审批通过!");
}else{
System.out.println("此人可能想辞职,审批不通过!");
}
}
}
- 客户端组装成链表结构调用
java
// 责任链模式 -----不用修改代码 就可以添加相应的子类
public static void main(String[] args) {
Leader a=new Director(":张三,");
Leader b=new Manager(":李四,");
Leader c=new GeneralManager(":王五,");
//责任链上的对象关系
a.setNextLeader(b);
b.setNextLeader(c);
//开始请假操作
LeaveRequest req=new LeaveRequest("Tom",8,"相亲");
a.HandleReques(req);
}
更多设计模式学习:
设计模式持续更新中...