用Java写一个责任链设计模式
时间: 2023-10-16 21:11:06 浏览: 43
责任链是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到处理者成功地处理请求为止。在这个模式中,每个处理者都有一个指向下一个处理者的引用,如果一个处理者不能处理请求,它就将请求传递给下一个处理者,直到请求被处理或者请求到达了处理者链的末端。
下面是一个使用Java编写的责任链设计模式示例:
1. 定义一个抽象处理者类,它包含一个指向下一个处理者的引用和一个处理请求的抽象方法。
```
public abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handleRequest(Request request);
}
```
2. 定义具体的处理者类,它们实现抽象处理者类中的处理请求的方法,并根据自己的能力来判断是否能够处理请求,如果不能处理,则将请求传递给下一个处理者。
```
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE1) {
System.out.println("ConcreteHandler1处理了请求");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE2) {
System.out.println("ConcreteHandler2处理了请求");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
public class ConcreteHandler3 extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.TYPE3) {
System.out.println("ConcreteHandler3处理了请求");
} else if (nextHandler != null) {
nextHandler.handleRequest(request);
}
}
}
```
3. 定义请求类,它包含一个类型字段和一个描述字段。
```
public class Request {
private RequestType type;
private String description;
public Request(RequestType type, String description) {
this.type = type;
this.description = description;
}
public RequestType getType() {
return type;
}
public String getDescription() {
return description;
}
}
```
4. 定义请求类型枚举。
```
public enum RequestType {
TYPE1, TYPE2, TYPE3
}
```
5. 在客户端中创建处理者对象,并设置它们的下一个处理者,形成处理者链。然后,将请求发送到处理者链的第一个处理者。
```
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
handler1.setNextHandler(handler2);
handler2.setNextHandler(handler3);
Request request1 = new Request(RequestType.TYPE1, "请求1");
Request request2 = new Request(RequestType.TYPE2, "请求2");
Request request3 = new Request(RequestType.TYPE3, "请求3");
handler1.handleRequest(request1);
handler1.handleRequest(request2);
handler1.handleRequest(request3);
}
}
```
输出结果:
```
ConcreteHandler1处理了请求
ConcreteHandler2处理了请求
ConcreteHandler3处理了请求
```