责任链模式可以对一个流程的各个环节进行解耦,每个环节放在一个handler中,依据这些环节的执行顺序,相应的handler组成单向不循环链表。
public abstract class AbstractHandler {
protected AbstractHandler nextHandler;
public void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
/**
*
* @param x
* @return 此示例中设置的返回逻辑如下:
* 1. 设handler的序号为 i,其中 i = 1, 2, 3,..., n
* 2. 当输入 x 进入第 i 个处理程序时:
* 2.1 若未满足“传递”条件,则返回当前handler的序号 i。
* 2.2 否则:
* 2.2.1 若 i < n,则进入第 (i + 1) 个handler并返回 i + 1。
* 2.2.2 若 i = n,则返回 i + 1。// x 已通过所有handler。
*/
public abstract int handle(int x);
}
public class FirstHandler extends AbstractHandler {
private int getData() {
return 60;
}
private int level = 1;
@Override
public int handle(int x) {
int data = getData();
if (x >= data) {
if ( null != this.nextHandler ) {
return this.nextHandler.handle(x);
}
}
return level;
}
}
public class SecondHandler extends AbstractHandler {
private int getData() {
return 75;
}
int level = 2;
@Override
public int handle(int x) {
int data = getData();
if (x >= data) {
if ( null != this.nextHandler ) {
return this.nextHandler.handle(x);
}
}
return level;
}
}
public class ThirdHandler extends AbstractHandler {
private int getData() {
return 90;
}
private int level = 3;
@Override
public int handle(int x) {
int data = getData();
if (x >= data) {
if ( null != this.nextHandler ) {
this.nextHandler.handle(x);
} else {
return level + 1;
}
}
return level;
}
}
public class HandlerClient {
public static void main(String[] args) {
FirstHandler firstHandler = new FirstHandler();
SecondHandler secondHandler = new SecondHandler();
ThirdHandler thirdHandler = new ThirdHandler();
firstHandler.setNextHandler(secondHandler);
secondHandler.setNextHandler(thirdHandler);
Random random = new Random();
for ( int i=0; i<50; i++ ) {
// 生成一个 0 到 99 之间的随机整数
int x = random.nextInt(101);
System.out.println("x=" + x + " result=" + firstHandler.handle(x));
}
}
}
如果在某个handler执行失败,则返回该环节执行失败的相应信息;否则进入下一个handler继续执行。如果末端handler也正常执行完毕,那么也就意味着这一段业务流程完整且成功地执行了一次。