一、有中斷式
public abstract class ChainHandler<T> {
private ChainHandler nextHandler;
public boolean process (T event) {
return handleEvent(event) ||
nextHandler != null && nextHandler.process(event);
}
public void setNextHandler(ChainHandler handler){
nextHandler = handler;
}
/**
* 返回 true 就不再往下繼續流程
* @param event
* @return
*/
abstract boolean handleEvent(T event);
}
每個鏈節點如果要阻斷全流程,可以直接在handleEvent結束後返回true,後續的節點不再執行,否則直到全部節點執行完畢。
二、無阻斷式
public class ConvertChain<T> implements RouterConverter<T> {
private List<RouterConverter<T>> converters = new ArrayList<>();
public void addConverter(RouterConverter<T> converter){
converters.add(converter);
}
private T convert(int index ,T o) {
if(index<converters.size()) {
int preIndex = index;
index++;
o = convert(index,converters.get(preIndex).convert(o));
}
return o;
}
@Override
public T convert(T o) {
return convert(0,o);
}
}
調用convert時,會把節點集合中的所有節點執行一遍。適合做組裝、轉化、攔截等。Okhttp攔截器執行就是這個模型。