← 返回首页
设计模式基础教程(二十三)
发表时间:2021-08-26 18:05:12
责任链模式

1.责任链模式

职责链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。由于英文翻译的不同,职责链模式又称为责任链模式,它是一种对象行为型模式。

职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。 链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并使请求沿着链传递,由链上的处理者对请求进行相应的处理,客户端无须关心请求的处理细节以及请求的传递,只需将请求发送到链上即可,将请求的发送者和请求的处理者解耦。这就是职责链模式的模式动机。

职责链模式包含如下角色: - Handler: 抽象处理者 - ConcreteHandler: 具体处理者 - Client: 客户类

2.实例

某OA系统需要提供一个假条审批的模块,如果员工请假天数小于3天,主任可以审批该假条;如果员工请假天数大于等于3天,小于10天,经理可以审批;如果员工请假天数大于等于10天,小于30天,总经理可以审批;如果超过30天,总经理也不能审批,提示相应的拒绝信息。

项目结构图如下:

领导抽象类

public abstract class Leader {
    protected String name;
    protected Leader successor;//上级领导

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

    public void setSuccessor(Leader successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(LeaveRequest leaveRequest);
}

设计请假请求类

public class LeaveRequest {
    private String employeeName;
    private int leaveDays;
    public LeaveRequest(String employeeName, int leaveDays) {
        super();
        this.employeeName = employeeName;
        this.leaveDays = leaveDays;
    }

    public String getEmployeeName() {
        return employeeName;
    }

    public void setEmployeeName(String leaveName) {
        this.employeeName = employeeName;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

    public void setLeaveDays(int leaveDays) {
        this.leaveDays = leaveDays;
    }

}

直接领导类

public class Director extends Leader {

    public Director(String name) {
        super(name);
    }
    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        if(leaveRequest.getLeaveDays()<3){
            System.out.println("直接领导:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的假条,请求天数为:"+leaveRequest.getLeaveDays()+"天!");
        }else{
            if(this.successor!=null){
                this.successor.handleRequest(leaveRequest);
            }
        }
    }
}

经理类

public class Manager extends Leader {

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

    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        if(leaveRequest.getLeaveDays()<10){
            System.out.println("经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假天数为:"+leaveRequest.getLeaveDays()+"天。");
        }else{
            if(this.successor!=null){
                this.successor.handleRequest(leaveRequest);
            }
        }
    }

}

副总经理类

public class ViceGeneralManager extends Leader {

    public ViceGeneralManager(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        if(leaveRequest.getLeaveDays()<20){
            System.out.println("副总经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假时间为:"+leaveRequest.getLeaveDays()+"天。");
        }else{
            if(this.successor!=null){
                this.successor.handleRequest(leaveRequest);
            }
        }
    }
}

总经理类

public class GeneralManager extends Leader {

    public GeneralManager(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void handleRequest(LeaveRequest leaveRequest) {
        if(leaveRequest.getLeaveDays()<30){
            System.out.println("总经理:"+this.name+"审批员工"+leaveRequest.getEmployeeName()+"的请假条,请假时间为:"+leaveRequest.getLeaveDays()+"天。");
        }else{
            System.out.println("莫非"+leaveRequest.getEmployeeName()+"想辞职,居然请假 "+leaveRequest.getLeaveDays()+"天。");
        }
    }
}

测试类

public class TestChainDemo01 {

    public static void main(String[] args) {
        Leader director=new Director("王明直接领导");
        Leader manager=new Manager("赵强经理");
        Leader viceManager=new ViceGeneralManager("肖宏副总经理");
        Leader generalManager=new GeneralManager("李波总经理");

        //设置领导对应关系链
        director.setSuccessor(manager);
        manager.setSuccessor(viceManager);
        viceManager.setSuccessor(generalManager);

        LeaveRequest lr1=new LeaveRequest("张三", 2);
        director.handleRequest(lr1);

        LeaveRequest lr2=new LeaveRequest("李四", 5);
        director.handleRequest(lr2);

        LeaveRequest lr3=new LeaveRequest("王五", 15);
        director.handleRequest(lr3);

        LeaveRequest lr4=new LeaveRequest("马六", 25);
        director.handleRequest(lr4);

        LeaveRequest lr5=new LeaveRequest("钱七", 35);
        director.handleRequest(lr5);
    }
}

运行结果:
直接领导:王明直接领导审批员工张三的假条,请求天数为:2天!
经理:赵强经理审批员工李四的请假条,请假天数为:5天。
副总经理:肖宏副总经理审批员工王五的请假条,请假时间为:15天。
总经理:李波总经理审批员工马六的请假条,请假时间为:25天。
莫非钱七想辞职,居然请假 35天。