责任链模式处理请假审批

什么是责任链模式:
责任链模式属于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:以上均为自己的理解,欢迎指正 共同学习,谢谢!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值