概述
责任链设计模式,顾名思义,就是在一条链上执行逻辑的过程。
实现原理
上图展示的是责任链模式的一个处理过程,每一个处理节点对应的是一个processor
实践
1.流水账式代码
在日常开发的过程中,我们经常会遇到这样的问题,一个业务的分支很多,然后随着业务的不断发展,我们的代码中会通过很多的 if…else… 进行实现。这样最后的结果就是代码慢慢的成了流水账式的代码。
①.代码没法扩展
②.可能改一处代码就会影响一大片,测试成本很高
③.一个方法中干了很多的事,不符合单一原则
2.使用责任链模式的代码
public class ChainContext<P, T> {
/**
* 上下文窗口数据
*/
private ContextContainer contextContainer;
/**
* 返回数据值
*/
private T resultData;
/**
* 链式参数
*/
private P param;
/**
* 链式Processor
*/
private LinkedList<ChainProcessor<P, T>> processor;
private ChainContext(Builder<P, T> builder) {
param = builder.param;
processor = builder.processor;
this.contextContainer = new ContextContainer() {
Map<String, Object> container = Maps.newHashMap();
@Override
public <D> void addContextData(String key, D data) {
container.put(key, data);
}
@Override
public <D> D getContextData(String key, Class<D> dClass) {
return dClass.cast(container.get(key));
}
};
}
public P getParam() {
return param;
}
public LinkedList<ChainProcessor<P, T>> getProcessor() {
return processor;
}
public T process() {
if (CollectionUtils.isEmpty(this.getProcessor())) {
return null;
}
ChainProcessor<P, T> next = this.getProcessor().poll();
while (next != null) {
next.process(this);
next = this.getProcessor().poll();
}
return this.resultData;
}
public <D> void addContextData(String key, D data) {
this.contextContainer.addContextData(key, data);
}
public <D> D getContextData(String key, Class<D> dClass) {
return this.contextContainer.getContextData(key, dClass);
}
public T getResultData() {
return resultData;
}
public void setResultData(T resultData) {
this.resultData = resultData;
}
public static final class Builder<P, T> {
private P param;
private LinkedList<ChainProcessor<P, T>> processor;
public Builder<P, T> param(P param) {
this.param = param;
return this;
}
public Builder<P, T> addNextProcessor(ChainProcessor<P, T> processor) {
if (this.processor == null) {
this.processor = new LinkedList<>();
}
this.processor.offer(processor);
return this;
}
public ChainContext<P, T> build() {
return new ChainContext<>(this);
}
}
}
/**
* 上下文容器
*/
public interface ContextContainer {
/**
* 增加上下数据
* @param key
* @param data
* @param <D>
*/
<D> void addContextData(String key, D data);
/**
* 获取上下文数据
* @param key
* @param <D>
* @return
*/
<D> D getContextData(String key, Class<D> dClass);
}
参考文章:https://www.jianshu.com/p/452dd3252513