设计模式 - 浅谈责任链模式
责任链模式
模式功能说明:它让你可以将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或者将其传递给链上的下一个处理者。
模式思路与原理
职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
代码示例
abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(int request);
}
class ConcreteHandler1 extends Handler {
public void handleRequest(int request) {
if (request >= 0 && request < 10) {
System.out.println("Handler1处理请求" + request);
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
class ConcreteHandler2 extends Handler {
public void handleRequest(int request) {
if (request >= 10 && request < 20) {
System.out.println("Handler2处理请求" + request);
} 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);
int[] requests = {2, 5, 14, 22, 18, 3, 27, 20};
for (int request : requests) {
h1.handleRequest(request);
}
}
}
我们有两个处理者类ConcreteHandler1
和ConcreteHandler2
,它们都继承自抽象处理者类Handler
。每个处理者都有一个successor
,当它不能处理请求时,会将请求传递给successor
。在客户端,我们创建了两个处理者对象
,并将它们连接起来,然后将一些请求传递给第一个处理者。
使用场景:
- 当你希望动态地根据对象状态决定处理者时,可以使用责任链模式。
- 当你不希望请求发送者与接收者耦合时,可以使用责任链模式。
优缺点
优点:
- 你可以控制请求处理的顺序。
- 单一职责原则,你可以将处理逻辑分解成许多不同的类。
- 开闭原则,你可以在不更改现有代码的情况下在程序中添加新的处理者。
缺点:
一些请求可能会未被处理。
总结
责任链模式使用了设计原则有:开闭原则(对扩展开放,对修改关闭)和单一职责原则(一个类只做一件事情)。 责任链模式是一种将请求的发送者和接收者解耦的方法,它允许请求在处理者链上进行传递,每个处理者都有机会处理请求。这种模式在处理多级审批、事件/消息系统等场景时非常有用。