用途
当有一连串的类似的设备都需要进行某些操作时,或者类似于审批单一层一层审批这种情况时,就可以组装责任链来优化代码。
类图
常见的实现
- 在抽象父类内部实现Builder模式,使用链表实现,组装时就可以像下面这样,使用此方式时,如果在实现类的doHandler()方法中间有执行跳出操作时,一定要记得next.doHandler()后return
// 组装链
AbsractHandler.builder builder = new AbstractHandler.Builder().addHandler(new CurrentHandler1()).addHandler(new CurrentHandler2());
// 执行
builder.doHandler();
抽象类实现
public abstract class AbstractHandler {
/**
* <链节点>
*/
private AbstractHandler next;
public void setNext(AbstractHandler next) {
this.next = next;
}
public AbstractHandler getNext() {
return this.next;
}
/**
* <筛选设备>
*
* @param context <上下文>
*/
public abstract void doFilter(Context context);
/**
* <链路构造器>
*
*/
public static class Builder {
private AbstractHandler head;
private AbstractHandler tail;
/**
* <添加节点>
*
* @param handler <具体执行类>
* @return <构造器>
*/
public Builder addHandler(AbstractHandler handler) {
if (this.head == null) {
this.head = handler;
this.tail = handler;
return this;
}
this.tail.setNext(handler);
this.tail = handler;
return this;
}
/**
* <返回头结点>
*
* @return <头结点>
*/
public AbstractHandler build() {
return this.head;
}
}
}
- 不借助工具,直接new;
// 构造
CurrentHandler1 handler1 = new CurrentHandler1();
handler1.setNext(new CurrentHandler2());
// 执行
handler1.doHandler();
- 使用spring
给子类都加上@Component注解,作为单例bean添加进spring容器中
再给子类添加@Order注解进行排序
调用时使用@Autowired注解
// 构造
@Autowired
List<AbstractHandler> handlers;
// 执行
handlers.foreach(handler ->handler.doHandler());