什么是责任链模式:
责任链模式属于23种设计模式的行为型模式,责任链就是将能够处理同一请求的对象变成一条链,所提交的请求会按照链往下进行,直到请求可以处理的节点才完成请求。
模拟场景:
请假审批流程:
//员工类
public class LeaveReq {
private String name; //员工姓名
private int leaveDays; //请假天数
private String reason; //原因
//构造函数
public LeaveReq(String name,int leaveDays,String reason){
super();
this.name = name;
this.leaveDays = leaveDays;
this.reason = reason;
}
//此处省去get/set方法
}
//领导类(抽象类)
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 handleReq(LeaveReq req);
}
//主任类(具体实现类)
public class Director extends Leader {
public Director(String name) {
super(name);
}
/** 静态单例*/
private static class Singleton{
private static final Director instance = new Director("主任");
}
public static Director getInstance(){
return Singleton.instance;
}
@Override
public void handleReq(LeaveReq req) {
if (req.getLeaveDays() < 3) { //员工请假天数小于3天主任可直接审批
System.out.println("员工:" + req.getName() + ",想请" + req.getLeaveDays() + "天假,理由:" + req.getReason());
System.out.println(this.name + "审批通过!");
} else { //超出权限范围,交给上级领导处理
if (this.nextLeader != null) {
this.nextLeader.handleReq(req);
}
}
}
}
//经理类(具体实现类)
public class Manager extends Leader {
public Manager(String name) {
super(name);
}
/** 静态单例*/
private static class Singleton {
private static final Manager instance = new Manager("经理");
}
public static Manager getInstance() {
return Singleton.instance;
}
@Override
public void handleReq(LeaveReq req) {
if (req.getLeaveDays() < 10) { //员工请假天数小于10天经理可直接审批
System.out.println("员工:" + req.getName() + ",想请" + req.getLeaveDays() + "天假,理由:" + req.getReason());
System.out.println(this.name + "审批通过!");
} else { //超出权限范围,交给上级领导处理
if (this.nextLeader != null) {
this.nextLeader.handleReq(req);
}
}
}
}
//总经理类(具体实现类)
public class GeneralManager extends Leader {
public GeneralManager(String name) {
super(name);
}
/** 静态单例*/
private static class Singleton {
private static final GeneralManager instance = new GeneralManager("总经理");
}
public static GeneralManager getInstance() {
return GeneralManager.Singleton.instance;
}
@Override
public void handleReq(LeaveReq req) {
if (req.getLeaveDays() < 30) {//员工请假天数小于30天总经理可直接审批
System.out.println("员工:" + req.getName() + ",想请" + req.getLeaveDays() + "天假,理由:" + req.getReason());
System.out.println(this.name + "审批通过!");
} else { //没有上级领导,直接返回拒绝
System.out.println("你请假时间太长了,拒绝!");
}
}
}
//客服端测试类
public class Client {
public static void main(String[] args) {
Director director = Director.getInstance();
Director directorz = Director.getInstance();
Manager manager = Manager.getInstance();
GeneralManager gm = GeneralManager.getInstance();
//测试单例是否为同一对象
System.out.println("验证是否为单例:" + (director == directorz));
//责任链对象之间关系
director.setNextLeader(manager);
manager.setNextLeader(gm);
//开始请假操作
LeaveReq leaveReq = new LeaveReq("攻城狮", 2, "回家相亲");
director.handleReq(leaveReq);
}
}
//测试结果:
验证是否为单例:true
员工:攻城狮,想请2天假,理由:回家相亲
主任审批通过!
/*ps:有同学会说可以直接用if else去完成,确实可以这么做但是实际业务
并不像我所做的这么简单,其二就是用if else的方式去做不能做到代码的可
拓展性和遵循开闭原则,以上是我个人的拙见,欢迎指正,共同学习*/
开发中常见的责任链应用:
1.java中的异常机制
2.servlet中的过滤器
3.struts2中的拦截器
ps:以上均为自己的理解,欢迎指正 共同学习,谢谢!