职责链模式

本文介绍了职责链模式的概念和应用,通过一个具体的报销审批案例展示了如何将职责链模式应用于实际场景中。代码示例展示了部门经理和项目经理两个角色如何通过职责链动态组合来处理不同金额的报销请求,实现了请求者和接收者的松耦合,同时允许动态调整审批流程。该模式的优点包括请求处理的灵活性和职责的明确划分,但也存在产生过多对象和请求可能未被处理的缺点。
摘要由CSDN通过智能技术生成

1. 类图

image.png

  • Handler:定义职责的接口,通常定义处理请求的方法,可以在此处实现后继链
  • ConcreteHandler:实现职责的类,对职责范围内请求的处理,对职责范围外请求的转发
  • Client:客户端,向链上的具体处理对象提交请求,让职责链负责处理

2. 示例

分离职责,动态组合

2.1 职责接口

public abstract class Handler {
    // 持有后继的职责对象
    protected Handler handler;

    public void setHandler(Handler handler) {
        this.handler = handler;
    }

    public abstract String handlRequest(String user, double fee);
}

2.2 职责实现类

public class DepManager extends Handler {
    @Override
    public String handlRequest(String user, double fee) {
        String handleResult = "";
        if (fee < 1000) {
            handleResult = "部门经理同意[" + user + "]的报销请求";
        } else {
            System.out.println("报销金额超过1000,部门经理无权审批");
            if (this.handler != null) {
                handleResult = this.handler.handlRequest(user, fee);
            }
        }
        return handleResult;
    }
}

public class ProjectManager extends Handler {

    @Override
    public String handlRequest(String user, double fee) {
        String handleResult = "";
        if (fee < 500) {
            handleResult = "项目经理同意[" + user + "]的报销请求";
        } else {
            System.out.println("报销金额超过500,项目经理无权审批");
            if (this.handler != null) {
                handleResult = this.handler.handlRequest(user, fee);
            }
        }
        return handleResult;
    }
}

2.3 客户端

public class Client {
    public static void main(String[] args) {
        DepManager depManager = new DepManager();
        ProjectManager projectManager = new ProjectManager();
        projectManager.setHandler(depManager);

        System.out.println(projectManager.handlRequest("张三", 400));
        System.out.println(projectManager.handlRequest("李四", 800));
    }
}

3. 优点

  • 请求者和接收者松散耦合
  • 动态组合职责

4. 缺点

  • 产生很多细粒度对象
  • 请求不一定会被处理,需要提供默认处理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值