JAVA设计模式之责任链

前几天面试,面试官问我一个问题,servlet的过滤器的使用的是什么设计模式,当时我并不知道,因此就随便说了一个代理模式。面试完后经过查询了解到,servlet的过滤器的使用的责任链模式。通过对责任链模式的学习了解,发现工作中已经用到。

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

现在通过一个请假例子来详细说明责任链模式!角色:TeamLeader,CTO,CEO;TeamLeader有5天假的权利,CTO有10天假的权利,CEO是老板,只要他同意就行!!!!

抽象处理类

public abstract class Handler {
    /**
     * 继承者,责任链上的下一个处理人.
     */
    private Handler leader;
    /**
     * 
     * 处理请求.
     * 
     * @param req 请求
     * @return String返回值
     */
    public abstract boolean handRequest(int days);
    /**
     * 设置leader.
     * @return 返回leader
     */
    public Handler getLeader() {
        return leader;
    }
    /**
     * 获取leader.
     * @param leader 要设置的leader
     */
    public void setLeader(Handler leader) {
        this.leader = leader;
    }
}

TeamLeader处理类

public class TeamLeaderHandler extends Handler{

    @Override
    public boolean handRequest(int days) {
        boolean flag=false;
        if (days<=5) {
            System.out.println("TeamLeader:申请通过!!!");
        } else if (this.getLeader()!=null) {
            System.out.println("TeamLeader:超过5天我没权利!!!");
            this.getLeader().handRequest(days);
        } else {
            System.out.println("TeamLeader:申请不通过!!!");
        }
        return flag;
    }
}

CTO处理类

public class CTOHandler extends Handler{

    @Override
    public boolean handRequest(int days) {
        boolean flag=false;
        if (days<=10) {
            System.out.println("CTO:申请通过!!!");
        } else if (this.getLeader()!=null) {
            System.out.println("CTO:超过10天我没权利!!!");
            this.getLeader().handRequest(days);
        } else {
            System.out.println("CTO:申请不通过!!!");
        }
        return flag;
    }
}

CEO处理类

public class CEOHandler extends Handler{

    @Override
    public boolean handRequest(int days) {
        boolean flag=true;
        System.out.println("CEO:我是老板,我说了算!!!");
        System.out.println("CEO:申请通过!!!");
        return flag;
    }
}

我要请假啦

public class AskForLeave {
    public static void main(String[] args) {
        Handler handler=new TeamLeaderHandler();
        CTOHandler cto = new CTOHandler();
        cto.setLeader(new CEOHandler());
        handler.setLeader(cto);
        System.out.println("================第一次请假================");
        handler.handRequest(5); //请假5天
        System.out.println("================第二次请假================");
        handler.handRequest(10); //请假10天
        System.out.println("================第三次请假================");
        handler.handRequest(30); //请假30天
    }
}

我的三次请假结果

================第一次请假================
TeamLeader:申请通过!!!
================第二次请假================
TeamLeader:超过5天我没权利!!!
CTO:申请通过!!!
================第三次请假================
TeamLeader:超过5天我没权利!!!
CTO:超过10天我没权利!!!
CEO:我是老板,我说了算!!!
CEO:申请通过!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值