责任链模式是一种行为型设计模式,它允许将请求沿着处理者链进行传递,直到其中一个处理者处理请求为止。在该模式中,每个处理者都能够决定自己是否要处理请求,并在必要时将请求传递给链上的下一个处理者。这种模式实现了请求者与处理者之间的解耦,提高了系统的可扩展性和灵活性。
举个栗子:
首先我们定义一个请求对象 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 则没有被任何一个处理者处理。