定义
- 将能够处理同一请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。
责任链模式角色
- 抽象处理器(handler): 定义了处理器的处理方法,并维护了下一个处理器对象的引用;
- 具体处理器(ConcreteHandler): 实现了抽象处理器的处理方法,并确定了当前处理器是否可以处理,如果不能处理,就将请求交给下一个处理器处理;
场景
- 打牌时,轮流出牌
- 接力赛跑
- 大学中,奖学金审批
- 公司中,公文审批
- 公司中,请假审批
开发中常见的场景
- java中,异常机制就是一种责任链模式。一个try可以对应多个catch,当第一个catch不匹配类型,则自动跳到第二个catch。
- servlet开发中,过滤器的链式处理。
- struts2中,拦截器的调用也是经典的责任链模式;
公司里面,请假条的审批流程
- 如果请假天数小于3天,主任审批;
- 如果请假天数大于等于3天,小于7天,经理审批;
- 如果大于等于7天,小于30天,总经理审批;
- 如果大于30天,提示拒绝。
代码实现
- 封装请假的基本信息
/*** 封装请假的基本信息*/
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)
/*** 抽象类 责任链对象*/
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)
/*** 主任*/
public class Director extends Leader{public Director(String name) {super(name);}@Overridepublic 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);}@Overridepublic 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);}@Overridepublic 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("此人可能想辞职,审批不通过!");}}
}
- 客户端组装成链表结构调用
// 责任链模式 -----不用修改代码 就可以添加相应的子类
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);}
更多设计模式学习:
设计模式(1):介绍
设计模式(2):单例模式
设计模式(3):工厂模式
设计模式(4):建造者模式
设计模式(5):原型模式
设计模式(6):桥接模式
设计模式(7):装饰器模式
设计模式(8):组合模式
设计模式(9):外观模式
设计模式(10):享元模式
设计模式(11):适配器模式
设计模式(12):代理模式
设计模式(13):模板方法模式
设计模式(14):命令模式
设计模式(15):迭代器模式
设计模式(16):观察者模式
设计模式(17):中介者模式
设计模式(18):状态模式
设计模式(19):策略模式
设计模式持续更新中…