兩種責任鏈式調用的總結

一、有中斷式

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攔截器執行就是這個模型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章