责任链模式(chain of responsibility)

一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。

定义:

  为了避免请求发送者与多个请求处理者耦合在一起(使用 if  选择语句处理请求),将所有请求的处理者通过前一对象记住其下一个对象的引用(链表)而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

结构:

  请求对象:需要被处理的信息。

  抽象处理类:待实现的处理方法,以及指向下一个处理类的引用。

  处理类:具体的处理类


 

例如:

 

 

请假条:

public 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 abstract class Leaders {
    protected String name;//审批者
    protected Leaders nextLeader;//下一级审批对象

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

    //设置下一级审批对象
    public void setNextLeader(Leaders nextLeader) {
        this.nextLeader = nextLeader;
    }

    /**
     * 处理请求的核心业务方法
     */
    public abstract void handlerRequest(LeaveRequest request);

    /**
     * 显示审批信息
     */
    protected void dispayDatas(LeaveRequest request){
        System.out.println("请假人:"+request.getName());
        System.out.println("请假天数:"+request.getLeaveDays());
        System.out.println("事由:"+request.getReason());
        System.out.println("审批人:"+this.name);
        System.out.println("------------------------------");
    }
}

具体审批人员1:主任可批三天以内的假。

public class Director extends Leaders{

    //构造器
    public Director(String name) {
        super(name);
    }

    //可批三天以内假条
    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<3){
            this.dispayDatas(request);//显示审批内容
        }else {
            this.nextLeader.handlerRequest(request);//交给上级处理
        }
    }
}

具体审批人员2:经理可批15天以内的假。

public class Manage extends Leaders{

    public Manage(String name) {
        super(name);
    }
    //可批十天以内
    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<10){
            this.dispayDatas(request);//显示审批内容
        }else {
            this.nextLeader.handlerRequest(request);//交给上级处理
        }
    }
}

具体审批人员2:经理可批30天以内的假。

public class GeneralManage extends Leaders{

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

    @Override
    public void handlerRequest(LeaveRequest request) {
        if(request.getLeaveDays()<30){
            this.dispayDatas(request);//显示审批内容
        }else {
            System.out.println(request.getName()+"请假:"+request.getLeaveDays()+"天");
            System.out.println(this.name+"批示:建议申请离职。");
        }
    }
}

测试:

public static void main(String[] args) {
        //创建处理者
        Leaders leaders1 = new Director("好主任");
        Leaders leaders2 = new Manage("流经理");
        Leaders leaders3 = new GeneralManage("呱总经理");

        //组装责任链对象的关系
        leaders1.setNextLeader(leaders2);
        leaders2.setNextLeader(leaders3);

        //创建请求
        LeaveRequest request1 = new LeaveRequest("猪王",2,"回去睡觉打呼噜");
        LeaveRequest request2 = new LeaveRequest("佩奇",9,"去做电吹风机器");
        LeaveRequest request3 = new LeaveRequest("虹猫",23,"准备去仗剑走天涯");
        LeaveRequest request4 = new LeaveRequest("大奔",45,"练习奔雷剑法");

        //处理请求
        leaders1.handlerRequest(request1);
        leaders1.handlerRequest(request2);
        leaders1.handlerRequest(request3);
        leaders1.handlerRequest(request4);
    }

测试结果:

 

posted @ 2022-11-25 23:06  在博客做笔记的路人甲  阅读(35)  评论(0编辑  收藏  举报