设计模式(2)——责任链模式

责任链模式——定义

什么是责任链模式呢?

我们可以先来看一个场景:

公司有三个角色,普通员工、主管、总监。普通员工要请三天内的假只要上报主管就行,可如果要三天以上可能主管就没办法审批,就得把请假上报到总监。

那么这段逻辑可以用以下代码体现:

// 返回审批结果
    public void getResult(Integer days) {
        if ("主管".equals(this.jobType)) {
            if (days <= 3) {
                System.out.println("我同意了");
            } else {
                System.out.println("我无权处理");
            }
        } else if ("总监".equals(this.jobType)) {
            System.out.println("我同意了");
        }
    }

可以看到这段代码有太多的分支判断,后续的扩展性维护性极低。

而责任链模式就是应用在这一类场景中。

先来看看责任链模式的结构:

图源于《大话设计模式》

在这里插入图片描述

图看不懂没关系,可以先看实现等回过头再慢慢理解。

代码实现

首先把主管、经理单独定义类,并且令它们继承同一个抽象类Handle:

public abstract class Handle {

    // 设置继任者
    protected Handle successor;

    public Handle setSuccessor(Handle successor) {
        this.successor = successor;
        return this;
    }

    // 审批
    public abstract void getResult(Integer day);
}

所谓继任者就是当自身无法处理这个请求的时候,会把请求传递给的一个对象。落实到我们的例子中就是,主管设置的继任者就是总监,当主管无法处理三天以上假期的请求时,就是调用总监请求。

主管类:

// 主管
public class Manager extends Handle {
    @Override
    public void getResult(Integer day) {
        if (day < 3) {
            System.out.println("我同意了");
        } else {
            System.out.println("转给总监审批");
            this.successor.getResult(day);
        }
    }
}

总监类:

// 总监
public class Director extends Handle {

    @Override
    public void getResult(Integer day) {
        System.out.println("我同意了");
    }
}

员工发起请假(客户端调用):

public static void main(String[] args) {
         Handle manager = new Manager();
        Handle director = new Director();
        // 设置继任者
        manager.setSuccessor(director);
        System.out.println("开始请假两天");
        // 请2天
        manager.getResult(2);
        System.out.println("开始请假五天");
        // 请五天
        manager.getResult(5);
    }
    /** output
    开始请假两天
    我同意了
    开始请假五天
    转给总监审批
    我同意了
   

责任链的好处是当客户提交一个请求是不必关心它是由哪个对象处理的,服务端可以随时增加或修改处理请求的结构,增强了灵活性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值