设计模式之美24--责任链模式

在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请求。一个请求先经过A处理器处理,然后再把请求传递给B处理器,B处理器处理完后再传递给C处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。

需求:员工请假一天 主管审批, 请假2-3天 经理审批,请假3-30 天cto审批, 大于30不通过

public abstract class AbstractHandler {
    protected AbstractHandler nextHandler;

    void setNextHandler(AbstractHandler abstractHandler){
        this.nextHandler = abstractHandler;
    }

    abstract void handle(int days);
}


class DirectorIHandler extends AbstractHandler{

    @Override
    void handle(int days) {
        if (days >= 0 && days <= 1) {
            System.out.println("请假1天, 主管审批,请假成功");
        }else {
            System.out.println("请假"+days+"天, 主管级别不够");
            this.nextHandler.handle(days);
        }

    }
}

class ManagerIHandler extends AbstractHandler{

    @Override
    void handle(int days) {
        if (days >= 2 && days <= 3) {
            System.out.println("请假大于3天, 经理审批,请假成功");
        }else {
            System.out.println("请假大于3天, 经理级别不够,由cto审批");
            this.nextHandler.handle(days);
        }
    }
}

class CTOIHandler extends AbstractHandler{

    @Override
    void handle(int days) {
        if (days > 3 && days < 30) {
            System.out.println("请假大于3天, 经理审批,请假成功");
        }else {
            System.out.println("请假天数太多,不通过");
        }
    }
}

 public static void main(String[] args) {
        DirectorIHandler directorIHandler = new DirectorIHandler();
        ManagerIHandler managerIHandler = new ManagerIHandler();
        CTOIHandler ctoiHandler = new CTOIHandler();
        directorIHandler.setNextHandler(managerIHandler);
        managerIHandler.setNextHandler(ctoiHandler);

        directorIHandler.handle(30);
    }

执行结果:
在这里插入图片描述

方式2:

import java.util.ArrayList;
import java.util.List;

public interface IHandler {
    boolean handle(int days);
}

// 员工请假一天 主管审批
//       请假2-3天  经理审批
//        请假3-5 天cto审批
// 主管
class DirectorHandler implements IHandler{

    @Override
    public boolean handle(int days) {
        if (days >= 0 && days <= 1) {
            System.out.println("请假1天, 主管审批,请假成功");

            return true;
        }
        System.out.println("请假"+days+"天, 主管级别不够");
        return false;
    }
}

// 经理
class ManagerHandler implements IHandler{

    @Override
    public boolean handle(int days) {
        if (days >= 2 && days <= 3) {
            System.out.println("请假2-3天, 经理审批,请假成功");
            return true;
        }
        System.out.println("请假"+days+"天, 经理级别不够");
        return false;
    }
}

// CTO
class CTOHandler implements IHandler{

    @Override
    public boolean handle(int days) {
        if (days > 3 && days < 30) {
            System.out.println("请假大于3天, 经理审批,请假成功");
            return true;
        }
        System.out.println("请假天数太多,不通过");
        return false;
    }
}

class IHandlerChain{
    IHandler iHandler;
    List<IHandler> iHandlerList = new ArrayList<>();

    public void setiHandler(IHandler iHandler){
        this.iHandler = iHandler;
    }

    public void addIHandler(IHandler iHandler){
        if (iHandler != null) {
            iHandlerList.add(iHandler);
        }
    }

    public void run(int days){
        for (IHandler handler : iHandlerList) {
            if (handler.handle(days)) {
                return;
            }
        }
    }

}

执行结果:
在这里插入图片描述
应用举例: Servlet Filter、Spring Interceptor, 敏感词过滤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值