责任链模式(Chain of Responsibility Pattern)案例(二)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象作为一个链式结构进行处理。 当请求从一个对象传递到另一个对象时,这些对象可以依次处理请求或将其传递给下一个对象,直到该请求被处理或直到最终没有对象处理请求。

举例来说,想象你要申请一份文件,需要经过三个级别的审批:部门经理、总经理和董事长。每个级别的领导都有不同的权限,如果当前级别无法处理请求,则将请求传递给下一个级别的领导。

让我们看一个基于JAVA的责任链模式的示例代码:

//抽象处理者:领导
abstract class Leader {
    protected String name;
    protected Leader nextLeader; // 上级领导

    public Leader(String name) {
        this.name = name;
    }

    //设置上级领导
    public void setNextLeader(Leader leader) {
        this.nextLeader = leader;
    }

    //处理请求
    public abstract void handleRequest(LeaveRequest request);
}

//具体处理者1:部门经理
class Director extends Leader {

    public Director(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() <= 3) {
            System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
            System.out.println("部门经理:" + this.name + ",审批通过!");
        } else {
            if (this.nextLeader != null) {
                this.nextLeader.handleRequest(request);
            }
        }
    }
}

//具体处理者2:总经理
class Manager extends Leader {

    public Manager(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() <= 10) {
            System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
            System.out.println("总经理:" + this.name + ",审批通过!");
        } else {
            if (this.nextLeader != null) {
                this.nextLeader.handleRequest(request);
            }
        }
    }
}

//具体处理者3:董事长
class Chairman extends Leader {

    public Chairman(String name) {
        super(name);
    }

    @Override
    public void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays() <= 30) {
            System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
            System.out.println("董事长:" + this.name + ",审批通过!");
        } else {
            System.out.println("员工:" + request.getName() + "请假,天数:" + request.getLeaveDays() + ",理由:" + request.getReason());
            System.out.println("董事长:" + this.name + ",审批不通过!");
        }
    }
}

//请求类
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 int getLeaveDays() {
        return leaveDays;
    }

    public String getReason() {
        return reason;
    }
}

//客户端代码
public class Client {
    public static void main(String[] args) {
        //创建责任链上的对象
        Leader director = new Director("张三");
        Leader manager = new Manager("李四");
        Leader chairman = new Chairman("王五");

        //设置链中的顺序
        director.setNextLeader(manager);
        manager.setNextLeader(chairman);

        //提交请求
        LeaveRequest request1 = new LeaveRequest("小明", 2, "身体不舒服");
        director.handleRequest(request1);

        Leave  Request request2 = new LeaveRequest("小红", 5, "外出旅游");
        director.handleRequest(request2);

        LeaveRequest request3 = new LeaveRequest("小李", 20, "家里有事");
        director.handleRequest(request3);

        LeaveRequest request4 = new LeaveRequest("小张", 35, "创业");
        director.handleRequest(request4);
    }
}

输出结果为:

员工:小明请假,天数:2,理由:身体不舒服
部门经理:张三,审批通过!
员工:小红请假,天数:5,理由:外出旅游
总经理:李四,审批通过!
员工:小李请假,天数:20,理由:家里有事
董事长:王五,审批通过!
员工:小张请假,天数:35,理由:创业
董事长:王五,审批不通过!

从中可以看到,当请假天数超过部门经理和总经理权限时,请求会依次传递给下一级领导,直到被最终的董事长处理。这就是责任链模式的应用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值