图解设计模式(10) 责任链模式

一、应用场景

    当责任或者功能呈层级划分时使用。    

    将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求,如果能则处理,如果不能则传递给链上的下一个对象。

    例如,单位请假审批, 小组长能批一天,超过一天要经理批;经理能批3天,超过3天要找CEO批;超过7天CEO拒绝。

              JDK中的Exception类也是使用的责任链模式。

  它与

         if() {

        }else if()

  的区别是,当增加新的流程时不需要修改原来的代码,符合开闭原则。

二、 具体实现

    实现要点

1. 定义一个abstract class,其中包含责任链的下一个对象和一个处理需求的方法;

2. 定义责任链上的各个类,extends 虚拟类。

3.设置好责任链的上下传递关系。

0. 先定义一个请假条类

public class Request {
    private String name; //请假人
    private int days; //请假天数
    private String excuse; //请假事由
    public Request(String name, int days, String excuse) {
        this.name = name;
        this.days = days;
        this.excuse = excuse;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getDays() {
        return days;
    }
    public void setDays(int days) {
        this.days = days;
    }
    public String getExcuse() {
        return excuse;
    }
    public void setExcuse(String excuse) {
        this.excuse = excuse;
    }
}

1. 定义一个abstract Leader类,作为每个审批者的原型

public abstract class Leader {
    protected Leader nextLeader; //下一个处理的领导
    public abstract void handleRequest(Request request);  //处理请求
    public void setNextLeader(Leader nextLeader){
        this.nextLeader = nextLeader;
    }
    
    //组织语言,方便打印而已
    public String organizeLanguage(Request request){
        return new String(request.getName() + "的" + request.getDays() + "天" + request.getExcuse());
    }
}

2. 定义各个Leader

class TeamLeader extends Leader{

    @Override
    public void handleRequest(Request request) {
        if (1 >= request.getDays()) {
            System.out.println("组长批准" + organizeLanguage(request));
        }
        else {
            this.nextLeader.handleRequest(request);
        }
    }
}

class Manager extends Leader{

    @Override
    public void handleRequest(Request request) {
        if (3 >= request.getDays()) {
            System.out.println("经理批准" + organizeLanguage(request));
        }
        else {
            this.nextLeader.handleRequest(request);
        }
    }
}

class CEO extends Leader{

    @Override
    public void handleRequest(Request request) {
        if (7 >= request.getDays()) {
            System.out.println("CEO批准" + organizeLanguage(request));
        }
        else {
            System.out.println("CEO拒绝批准 " + organizeLanguage(request));
        }
    }
}

3. 测试类, 在调用之前先设置Leader的层级关系

public class ClientTest {

    public static void main(String[] args) {
        Request request1 = new Request("Tom", 1, "事假");
        Request request2 = new Request("Tom", 2, "事假");
        Request request3 = new Request("Tom", 7, "事假");
        Request request4 = new Request("Tom", 10, "事假");
        
        TeamLeader teamLeader = new TeamLeader();
        Manager manager = new Manager();
        CEO ceo = new CEO();
        teamLeader.setNextLeader(manager); //设置责任链层级关系
        manager.setNextLeader(ceo);  //设置责任链层级关系
        
        //测试
        teamLeader.handleRequest(request1);
        teamLeader.handleRequest(request2);
        teamLeader.handleRequest(request3);
        teamLeader.handleRequest(request4);
    }
}

测试结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值