责任链模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。

在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递。所以责任链将请求的发送者和请求的处理者解耦了。

责任链的实现:

1. 创建一个处理者抽象类

//处理者抽象类
public abstract class Handler {
private Handler nextHandler;

public Handler getNextHandler() {
return nextHandler;
}

public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}

public abstract void handle(String request);
}

2. 创建三个具体的处理者

//处理者A
public class AHandler extends Handler {
@Override
public void handle(String request) {
if (request.equals("A")){
System.out.println("A号处理者处理了这个问题");
}else{
if (this.getNextHandler() != null){
this.getNextHandler().handle(request);
}else{
System.out.println("这个问题没有人处理");
}
}
}
}
//处理者B
public class BHandler extends Handler {
@Override
public void handle(String request) {
if (request.equals("B")){
System.out.println("B号处理者处理了这个问题");
}else{
if (this.getNextHandler() != null){
this.getNextHandler().handle(request);
}else{
System.out.println("这个问题没有人处理");
}
}
}
}
//处理者C
public class CHandler extends Handler {
@Override
public void handle(String request) {
if (request.equals("C")){
System.out.println("C号处理者处理了这个问题");
}else{
if (this.getNextHandler() != null){
this.getNextHandler().handle(request);
}else{
System.out.println("这个问题没有人处理");
}
}
}
}

3. 构建责任链处理问题

public class ChainMain {
public static void main(String[] args) {
Handler A = new AHandler();
Handler B = new BHandler();
Handler C = new CHandler();

A.setNextHandler(B);
B.setNextHandler(C);

A.handle("A");
A.handle("B");
A.handle("C");
A.handle("D");

}
}

【每天一个java设计模式(十九)】 - 责任链模式_设计模式