责任链设计模式chain of responsibility

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

代码演示:

1.请假条请求类LeaveRequest :

/**
 * 封装请假的基本信息
 */
public class LeaveRequest {
    private String empName;
    private int leaveDays;
    private String season;

    public LeaveRequest() {
    }

    public LeaveRequest(String empName, int leaveDays, String season) {
        this.empName = empName;
        this.leaveDays = leaveDays;
        this.season = season;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

    public int getLeaveDays() {
        return leaveDays;
    }

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

    public String getSeason() {
        return season;
    }

    public void setSeason(String season) {
        this.season = season;
    }
}

 2.抽象事物处理者,抽象类Leader :

public abstract class Leader {
    protected String name;
    /**
     * 责任链上的后继对象
     */
    protected Leader nextLeader;

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

    /**
     * 设定责任链上的后继对象
     * @param nextLeader
     */
    public void setNextLeader(Leader nextLeader) {
        this.nextLeader = nextLeader;
    }

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


}

3.三个具体事物处理对象:

(1).主任对象Director 

/**
 * 主任对象
 */
public class Director extends Leader {
    public Director(String name) {
        super(name);
    }

    @Override
    void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays()<3){
            System.out.println("员工:"+request.getEmpName());
            System.out.println("请假:"+request.getLeaveDays()+"天");
            System.out.println("理由:"+request.getSeason());
            System.out.println("主任:"+this.name+"通过");
        }else {
            if (this.nextLeader!=null){
                this.nextLeader.handleRequest(request);
            }
        }
    }
}

(2).经理对象Manager

/**
 * 经理对象
 */
class Manager extends Leader {

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

    @Override
    void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays()<10){
            System.out.println("员工:"+request.getEmpName());
            System.out.println("请假:"+request.getLeaveDays()+"天");
            System.out.println("理由:"+request.getSeason());
            System.out.println("经理:"+this.name+"通过");
        }else {
            if (this.nextLeader!=null){
                this.nextLeader.handleRequest(request);
            }
        }
    }
}

(3).总经理对象GeneraManager

/**
 * 总经理
 */
 class GeneraManager extends Leader{
    public GeneraManager(String name) {
        super(name);
    }

    @Override
    void handleRequest(LeaveRequest request) {
        if (request.getLeaveDays()<30){
            System.out.println("员工:"+request.getEmpName());
            System.out.println("请假:"+request.getLeaveDays()+"天");
            System.out.println("理由:"+request.getSeason());
            System.out.println("总经理:"+this.name+"通过");
        }else {
            System.out.println("莫非:"+request.getEmpName()+"不想干了?");
        }
    }
}

4.测试

public class App {
    public static void main(String[] args) {
        Leader director =new Director("张三");
        Leader manager =new Manager("李四");
        Leader generaManager=new GeneraManager("王五");

        //组织责任链对象关系
        director.setNextLeader(manager);
        manager.setNextLeader(generaManager);

        //开始请假
        LeaveRequest request=new LeaveRequest("罗翔",11,"去b站直播");
        director.handleRequest(request);
    }
}

结果:员工:罗翔
          请假:11天
          理由:去b站直播
          总经理:王五通过

应用场景:异常捕捉,servelet中过滤器。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愛沢かりん

感谢您对我的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值