责任链模式
文章目录
责任链模式的定义是:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
责任链模式适合于请求需要经过多个处理器,并被其中一个或多个处理器执行。
classDiagram
class Handler{
<<interface>>
+ setNext(Handler)
+ handler(Request)
}
class ConcreteHandler{
next:Handler
+ setNext(Handler)
+ handler(Request)
}
Handler o..> Handler
ConcreteHandler --|> Handler
代码实现:
// 抽象处理器
public abstract class Handler {
private Handler next;
// 初始化处理链
public static Handler init(Handler... handlers) {
Handler first = handlers[0];
for (int i = 1; i < handlers.length; i++) {
first.setNext(handlers[i]);
first = handlers[i];
}
return handlers[0];
}
public void setNext(Handler handler) {
next = handler;
}
// 处理当前请求
public abstract void handle(Request request);
//处理下一个请求
protected void nextHandle(Request request) {
if (next != null) {
next.handle(request);
}
}
}
public class HandlerA extends Handler {
@Override
public void handle(Request request) {
request.addName("HandlerA");
nextHandle(request);
}
}
public class HandlerB extends Handler {
@Override
public void handle(Request request) {
request.addName("HandlerB");
nextHandle(request);
}
}
// 请求
@Data
public class Request {
private final List<String> names = new ArrayList<>();
public void addName(String name) {
names.add(name);
}
}
public static void main(String[] args) {
Handler handler = Handler.init(new HandlerA(), new HandlerB());
Request request = new Request();
handler.handle(request);
System.out.println(request.getNames());
}
上面的例子跟链表相像,一个处理器保持有下一个处理器的引用。
另一种实现变体是处理器的引用统一由处理器链管理,处理器链决定处理的顺序。
public interface Handler {
void handle(Request request,HandlerChain chain);
}
public class HandlerA implements Handler{
@Override
public void handle(Request request, HandlerChain chain) {
request.addName("HandlerA");
chain.handle(request);
}
}
public class HandlerB implements Handler{
@Override
public void handle(Request request, HandlerChain chain) {
request.addName("HandlerB");
chain.handle(request);
}
}
public class HandlerChain {
private List<Handler> handlers = new ArrayList<>();
// 当前指针
int cur=0;
public void addHandler(Handler handler) {
handlers.add(handler);
}
public void handle(Request request){
if(cur>=handlers.size()){
return;
}
Handler handler = handlers.get(cur++);
handler.handle(request, this);
}
}
public static void main(String[] args) {
HandlerChain chain=new HandlerChain();
chain.addHandler(new HandlerA());
chain.addHandler(new HandlerB());
Request request=new Request();
chain.handle(request);
System.out.println(request.getNames());
}
责任链变化的地方是处理的流程。
优点是:
- 处理的顺序可以随时修改
- 方便新增或删除处理者
文章作者 梧桐碎梦
上次更新 2023-05-21 14:22:27