java设计模式(十六)职责链模式(Chain of Responsibility Pattern)

1、模式介绍:

职责链模式是一种行为设计模式,其中多个对象按顺序处理请求,直到其中一个对象能够处理请求为止。请求沿着链传递,直到有一个对象处理它为止。

2、应用场景:

职责链模式适用于以下场景:
请求的发送者不需要知道请求的处理细节,以及请求的处理者是谁。
多个对象可以处理同一个请求,但具体处理者在运行时确定。
系统需要动态地指定可以处理请求的对象集合

具体的应用场景包括:
权限验证:例如,一个网页访问请求可以经过多个权限验证器,任何一个验证器通过即可访问。
日志记录:日志记录器可以形成一个职责链,每个记录器记录不同级别的日志。
请求的分发:例如,一个请求可以经过多个过滤器或处理器,每个处理器负责不同的处理逻辑。

3、优点:

降低耦合度:请求的发送者和接收者解耦,可以灵活地添加或删除处理器。
增强了灵活性:可以动态地改变链的组成和处理顺序。
简化了对象:每个处理器只关注自己的任务,不需要了解整个处理流程。

4、缺点:

请求可能未被处理:如果链未正确配置,请求可能无法被处理。
性能问题:长链可能会影响性能,因为每个请求都可能沿着链传递到链的末端。

5、代码示例:

/**
 * 请求类
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class Request {
    private int level;

    public Request(int level) {
        this.level = level;
    }

    public int getLevel() {
        return level;
    }
}

/**
 * 抽象处理器类
 *
 * @author FM_南风
 * @date 2024/7/5
 */
abstract class Handler {
    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }

    public abstract void handleRequest(Request request);
}

/**
 * 具体处理器类 - 级别1处理器
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class ConcreteHandler1 extends Handler{
    public void handleRequest(Request request) {
        if (request.getLevel() <= 1) {
            System.out.println("ConcreteHandler1 处理请求");
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

/**
 * 具体处理器类 - 级别2处理器
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class ConcreteHandler2 extends Handler {
    public void handleRequest(Request request) {
        if (request.getLevel() <= 2) {
            System.out.println("ConcreteHandler2 处理请求");
        } else if (successor != null) {
            successor.handleRequest(request);
        }
    }
}

/**
 * 具体处理器类 - 级别3处理器
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class ConcreteHandler3 extends Handler{
    public void handleRequest(Request request) {
        if (request.getLevel() <= 3) {
            System.out.println("ConcreteHandler3 处理请求");
        } else {
            System.out.println("所有处理器均不能处理该请求");
        }
    }
}


/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class ChainClient {
    public static void main(String[] args) {
        // 创建处理器对象
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();

        // 设置处理链
        handler1.setSuccessor(handler2);
        handler2.setSuccessor(handler3);

        // 创建不同级别的请求
        Request request1 = new Request(2);
        Request request2 = new Request(5);

        // 处理请求
        handler1.handleRequest(request1); // 输出 ConcreteHandler2 处理请求
        handler1.handleRequest(request2); // 输出 所有处理器均不能处理该请求
    }
}

6、结果展示:

7、示例说明:

在这个例子中:

Request 类表示请求,具有一个级别属性。
Handler 是抽象处理器类,定义了处理请求的方法和持有下一个处理器的引用。
ConcreteHandler1ConcreteHandler2 和 ConcreteHandler3 是具体的处理器类,每个处理器根据自己的能力处理请求或传递到下一个处理器。
ChainOfResponsibilityPatternExample 是测试类,创建了一个简单的处理链,并测试不同级别的请求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>