Java设计模式——责任链模式

责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到其中一个处理者处理请求为止。在该模式中,每个处理者都能够决定自己是否要处理请求,并在必要时将请求传递给链上的下一个处理者。这种模式实现了请求者与处理者之间的解耦,提高了系统的可扩展性和灵活性。

举个栗子:

首先我们定义一个请求对象 Request 和处理者对象 Handler(抽象类):

复制代码
public class Request {
    private String name;
    private int type;

    public Request(String name, int type) {
        this.name = name;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public int getType() {
        return type;
    }
}

public abstract class Handler {
    protected Handler successor;

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

    public abstract void handleRequest(Request request);
}

其中 Request 表示请求对象,包含请求的名称和类型信息;Handler 是处理者对象的抽象类,定义了抽象方法 handleRequest 用于处理请求,同时提供了一个引用 successor 用于表示链上的下一个处理者。

接下来我们定义具体的处理者 ConcreteHandler1 和 ConcreteHandler2:

复制代码
public class ConcreteHandler1 extends Handler {
    public void handleRequest(Request request) {
        if (request.getType() == 1) {
            System.out.println("ConcreteHandler1 handled the request " + request.getName());
        } else {
            if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
}

public class ConcreteHandler2 extends Handler {
    public void handleRequest(Request request) {
        if (request.getType() == 2) {
            System.out.println("ConcreteHandler2 handled the request " + request.getName());
        } else {
            if (successor != null) {
                successor.handleRequest(request);
            }
        }
    }
}

每个具体的处理者对象都会处理特定类型的请求,如果自己不能处理该请求,则将请求转发给下一个处理者。

最后,我们可以定义一个客户端进行测试:

复制代码
public class Client {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandler1();
        Handler h2 = new ConcreteHandler2();

        h1.setSuccessor(h2);

        Request r1 = new Request("Request 1", 1);
        h1.handleRequest(r1);

        Request r2 = new Request("Request 2", 2);
        h1.handleRequest(r2);

        Request r3 = new Request("Request 3", 3);
        h1.handleRequest(r3);
    }
}

输出结果为:

复制代码
ConcreteHandler1 handled the request Request 1
ConcreteHandler2 handled the request Request 2

从结果可以看出,请求 Request 1 和 Request 2 被正确的处理了,而请求 Request 3 则没有被任何一个处理者处理。

相关推荐
驭渊的小故事2 小时前
Spring AOP 核心概念与通知类型详解
java·后端·spring
vipxieliang2 小时前
ValidX vs 手写验证代码:开发效率对比实测
java·spring boot·后端
vipxieliang3 小时前
虚拟线程与 GraalVM:Spring Boot 3.x 云原生性能跃迁
java·spring boot·后端
Rain的Java大神之路3 小时前
面试官最烦的答案:“我用 Redis + Token”!接口幂等 8 种方案 + 四层防御,把重复扣款工单干到 0
java·后端·面试
Rainmicro3 小时前
【无标题】
java·数据库·算法
驭渊的小故事3 小时前
Spring AOP 入门:从 AOP 概念到第一个耗时统计切面
java·后端·spring
天天被压力4 小时前
【A股分钟级高频数据完全手册 #09】A股历史分时交易数据接口:普通分时怎么批量下
java·人工智能·python
天天被压力4 小时前
【A股分钟级高频数据完全手册 #10】股票实时行情数据接口Python:公开源实时交易取数
java·人工智能·python
是2的10次方啊4 小时前
设计模式与生活⑯:天冷了,出门这身得一层层配
设计模式
apcipot_rain4 小时前
C++转Java日记(05)
java·开发语言·c++