JAVA设计模式,责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许你将请求的发送者和接收者解耦。在这种模式下,请求沿着责任链传递,直到某个对象能够处理该请求为止。每个对象都有机会处理请求或将其传递给链上的下一个对象。这种模式非常适合处理多步骤或多条件的请求处理流程。
### 主要组成部分
1. **Handler(处理器)**:定义一个处理请求的接口,通常包含一个`handleRequest`方法。有时候也包含一个指向下一个处理器的引用。
2. **ConcreteHandler(具体处理器)**:实现处理请求的接口。如果能处理,则处理请求;否则,将请求传递给下一个处理器。
3. **Client(客户端)**:创建并连接处理器链,然后向链的起始点发送请求。
### 实现步骤
1. 定义一个处理器接口。
2. 创建多个具体处理器类,实现处理器接口,并决定是否处理请求或传递给下一个处理器。
3. 在客户端构建处理器链,并发送请求。
### 示例代码
假设我们有一个审批系统,不同级别的经理可以处理不同金额的报销请求。
#### 处理器接口
```java
public interface Handler {
void setNext(Handler next);
void handleRequest(int amount);
}
```
#### 具体处理器
```java
public class ManagerA implements Handler {
private Handler next;
@Override
public void setNext(Handler next) {
this.next = next;
}
@Override
public void handleRequest(int amount) {
if (amount <= 500) {
System.out.println("ManagerA approved the request for " + amount + " yuan.");
} else if (next != null) {
next.handleRequest(amount);
}
}
}
public class ManagerB implements Handler {
private Handler next;
@Override
public void setNext(Handler next) {
this.next = next;
}
@Override
public void handleRequest(int amount) {
if (amount > 500 && amount <= 1000) {
System.out.println("ManagerB approved the request for " + amount + " yuan.");
} else if (next != null) {
next.handleRequest(amount);
}
}
}
public class ManagerC implements Handler {
private Handler next;
@Override
public void setNext(Handler next) {
this.next = next;
}
@Override
public void handleRequest(int amount) {
if (amount > 1000) {
System.out.println("ManagerC approved the request for " + amount + " yuan.");
} else if (next != null) {
next.handleRequest(amount);
}
}
}
```
#### 客户端
```java
public class Client {
public static void main(String[] args) {
Handler managerA = new ManagerA();
Handler managerB = new ManagerB();
Handler managerC = new ManagerC();
// 构建责任链
managerA.setNext(managerB);
managerB.setNext(managerC);
// 发送请求
managerA.handleRequest(300); // ManagerA
managerA.handleRequest(700); // ManagerB
managerA.handleRequest(1500); // ManagerC
}
}
```
### 运行结果
```
ManagerA approved the request for 300 yuan.
ManagerB approved the request for 700 yuan.
ManagerC approved the request for 1500 yuan.
```
### 总结
责任链模式使得多个对象有机会处理请求,从而避免了请求的发送者和接收者之间的耦合。每个对象都不需要知道链的结构,只需要知道如何将请求传递给下一个对象即可。这种模式非常适合于处理需要多个步骤或条件判断的场景。