设计模式——责任链模式

设计模式——责任链模式

定义: 该模式为了避免请求者与多个请求处理者耦合在一起, 将所有的请求处理者通过前一对象记住后一个对象的引用而连成一条链, 当有请求发生时, 将请求沿着这一条链传递, 直到有对象处理为止. 例如工作中的请假审批, 请假申请 -> 部门经理审批 -> 副总经理审批 -> 总经理审批

结构:

  1. 抽象处理者: 定义一个抽象处理接口, 包含抽象处理方法和一个后继连接
  2. 具体处理者: 实现抽象处理者的处理方法, 判断能否处理本次请求, 如果可以处理则处理, 不能处理则将请求转给后继者
  3. 客户类: 创建处理链, 并向链头的处理者提交请求, 客户不关心传递过程和处理细节

实现:

例: 请假处理系统. 部门负责人能处理

请假申请

/**
 * 请假条
 */
@AllArgsConstructor
@Data
public class LeaveRequest {

    // 姓名
    private String name;

    // 天数
    private int daysNum;

    // 请假内容
    private String content;

}

抽象处理者

/**
 * 抽象处理者类
 */
@Data
public abstract class Handler {

    private int numStart;

    private int numEnd;

    private Handler nextHandler;

    public Handler(int numStart) {
        this.numStart = numStart;
    }

    public Handler(int numStart, int numEnd) {
        this.numStart = numStart;
        this.numEnd = numEnd;
    }

    // 处理方法
    protected abstract void handleLeaveRequest(LeaveRequest request);

    // 提交请假条
    public final void submit(LeaveRequest request) {
        // 该领导进行审批
        this.handleLeaveRequest(request);

        // 请假天数超过了该领导能审批的长度
        // 需要传递给下一个领导审批
        if (this.nextHandler != null && request.getDaysNum() > numEnd) {
            this.nextHandler.submit(request);
        } else {
            System.out.println("流程结束");
        }
    }
}

具体处理者

/**
 * 部门管理者
 */
public class GroupLeader extends Handler {

    public GroupLeader() {
        // 只能处理一天以内的请假申请
        super(0, 1);
    }

    protected void handleLeaveRequest(LeaveRequest request) {
        System.out.println("部门管理者同意审批");
    }
}

/**
 * 经理
 */
public class Manager extends Handler {

    public Manager() {
        // 只能处理7天以内的请假申请
        super(0, 7);
    }

    protected void handleLeaveRequest(LeaveRequest request) {
        System.out.println("经理同意审批");
    }
}

Main

/**
 * 责任链模式
 *
 * 优点:
 * 1. 降低对象间耦合度
 * 2. 增加系统的可扩展性(可以根据需求创建新的请求处理类)
 * 3. 增强了给对象指派职责的灵活性(当工作流程变化, 可以动态的新增/删除链内成员, 也可以修改链内次序)
 * 4. 简化了对象之间的连接(一个对象只需要保持一个指向后继者的引用)
 * 5. 责任分担(每个对象只需要处理自己该处理的工作, 不能处理的传递个后继者即可)
 *
 * 缺点:
 * 1. 不能保证每个请求一定被处理
 * 2. 如果处理链较长, 会影响系统性能
 * 3. 职责链建立的合理性需要客户端保证, 增加了客户端的复杂性, 可能因为错误设置而导致系统异常(循环调用)
 */
public class Main {
    public static void main(String[] args) {
        LeaveRequest request = new LeaveRequest("wtw", 3, "不舒服");
        GroupLeader groupLeader = new GroupLeader();
        Manager manager = new Manager();
        groupLeader.setNextHandler(manager);
        groupLeader.submit(request);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值