責(zé)任鏈在開發(fā)中的實(shí)際應(yīng)用

使用場(chǎng)景:
項(xiàng)目中要使用到SQL解析器,目前選擇了2個(gè)解析器,但各有各的優(yōu)點(diǎn)。
解析器A:解析速度快,但兼容性差一些,有一些SQL支持不了,直接拋異常;
解析器B:解析速度慢,但兼容性好,幾乎所有SQL都可以正常解析。

同一個(gè)需求,我們可以優(yōu)先使用解析器A來(lái)處理,當(dāng)處理失敗(拋出異常時(shí))再使用解析器B處理。

具體開發(fā)方案:設(shè)計(jì)單向鏈表,先用表頭的處理器處理,處理失敗則流轉(zhuǎn)到下一個(gè)處理器進(jìn)行處理,直到處理成功為止。

代碼實(shí)現(xiàn):
1、定義行為接口

public interface IHandler {

    public boolean handle1(Object arg1, Object arg2);
    public String handle2(Object arg1);
}

2、對(duì)行為接口進(jìn)行抽象實(shí)現(xiàn),并實(shí)現(xiàn)一個(gè)單向鏈表結(jié)構(gòu)

public abstract class AbstractHandler implements IHandler{

    protected AbstractHandler next;
    public AbstractHandler next(){
        return this.next;
    }


    protected <R> R call(AbstractHandler header, Handler<R> handler){
        AbstractHandler chain = header;
        R result = null;
        do{
            try{
                result = handler.handle(chain);
                break;
            }catch(Exception e){
                if(chain.next() == null){
                    throw new RuntimeException();
                }
                chain = chain.next();
            }
        }while (chain != null);
        return result;
    }

    protected abstract class Handler<R>{
        public abstract R handle(AbstractHandler chain);
    }

    public AbstractHandler getNext() {
        return next;
    }

    public void setNext(AbstractHandler next) {
        this.next = next;
    }

    public static class Buider{
        private AbstractHandler header;
        private AbstractHandler tail;

        public static Buider create(){
            return new Buider();
        }

        public Buider addChain(AbstractHandler chain){
            if(header == null){
                this.header = this.tail = chain;
                return this;
            }
            this.tail.setNext(chain);
            this.tail = chain;
            return this;
        }

        public AbstractHandler build(){
            return this.header;
        }

    }

}

3、開發(fā)具體的處理器

public class OneHandler extends AbstractHandler{
    public boolean handle1(Object arg1, Object arg2) {
        return false;
    }

    public String handle2(Object arg1) {
        if(null == arg1){
            throw new RuntimeException();
        }
        return "用戶One解決第2個(gè)問(wèn)題";
    }
}


public class TwoHandler extends AbstractHandler{
    public boolean handle1(Object arg1, Object arg2) {
        return true;
    }

    public String handle2(Object arg1) {
        return "用戶Two解決第2個(gè)問(wèn)題";
    }
}

4、開發(fā)責(zé)任鏈調(diào)用者

public class HandlerChain extends AbstractHandler{

    private AbstractHandler chainHeader;

    public boolean handle1(final Object arg1, final Object arg2) {
        return call(chainHeader, new AbstractHandler.Handler<Boolean>(){
            public Boolean handle(AbstractHandler chain) {
                return chain.handle1(arg1, arg2);
            }
        });
    }

    public String handle2(final Object arg1) {
        return call(chainHeader, new AbstractHandler.Handler<String>(){
            public String handle(AbstractHandler chain) {
                return chain.handle2(arg1);
            }
        });
    }

    public void setChainHeader(AbstractHandler chainHeader) {
        this.chainHeader = chainHeader;
    }
    
}

5、實(shí)際調(diào)用

public static void main(String[] args) {
        AbstractHandler chainHeader = AbstractHandler.Buider.create()
                .addChain(new OneHandler())
                .addChain(new TwoHandler())
                .build();

        HandlerChain chain = new HandlerChain();
        chain.setChainHeader(chainHeader);

        System.out.println(chain.handle1(null,null));
        System.out.println(chain.handle2(null));

    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容