Java实现职责链模式
1. 职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将一个请求的发送者和接收者解耦,使多个对象都有机会处理这个请求。将这些对象串成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
2. 适用场景:
- 当多个对象可以处理同一请求,并且具体哪个对象处理该请求是在运行时确定时,可以使用职责链模式。
- 当希望由多个对象都有机会处理请求,而不是仅有一个确定的处理者时,可以使用职责链模式。
- 当需要在不明确接收者的情况下,向多个对象中的一个提交一个请求时,可以使用职责链模式。
3. 好处:
- 职责链模式使得请求的发送者和接收者之间解耦,发送者不需要知道请求是谁处理的,也不需要知道链的结构。
- 可以动态地添加或修改处理请求的对象,灵活性高。
- 可以对处理请求的顺序进行控制。
以下是Java中实现职责链模式的完整样例代码:
// 定义抽象处理者
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
// 具体处理者A
class ConcreteHandlerA extends Handler {
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("ConcreteHandlerA处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理者B
class ConcreteHandlerB extends Handler {
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("ConcreteHandlerB处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 具体处理者C
class ConcreteHandlerC extends Handler {
public void handleRequest(int request) {
if (request >= 20 && request < 30) {
System.out.println("ConcreteHandlerC处理请求 " + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
// 测试代码
public class Main {
public static void main(String[] args) {
// 构建职责链
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
handlerA.setSuccessor(handlerB);
handlerB.setSuccessor(handlerC);
// 发送请求
int[] requests = {5, 15, 25};
for (int request : requests) {
handlerA.handleRequest(request);
}
}
}
输出结果:
ConcreteHandlerA处理请求 5
ConcreteHandlerB处理请求 15
ConcreteHandlerC处理请求 25
以上代码中,定义了抽象处理者(Handler)及其三个具体处理者(ConcreteHandlerA、ConcreteHandlerB和ConcreteHandlerC),每个具体处理者都有一个后继处理者(successor)。
在测试代码中,构建了一个职责链,并发送了三个不同的请求。根据请求的值,职责链中的处理者依次处理请求。请求的值小于10由ConcreteHandlerA处理,大于等于10小于20由ConcreteHandlerB处理,大于等于20小于30由ConcreteHandlerC处理。如果某个处理者不能处理请求,则将请求传递给下一个处理者,直到有处理者处理该请求或职责链结束。