責任鏈模式(嵌套攔截器)

 

一、what is 責任鏈模式?

我前面的文章介紹過動態代理模式,該模式設計者只需要向開發者暴露攔截器即可。當有多個攔截器時,就衍生出了責任鏈。

什麼是責任鏈?比如請假流程:請假單看成對象,你要請假需要經過開發經理、部門經理、人事部門負責人等多個環節,每個環節的人都可以攔截你的請假申請單進行修改或審批,這裏把每個環節都看成攔截器的話,總共有三個攔截器。

一個對象在一條鏈上被多個攔截器處理的模式就是責任鏈模式,主要用於一個對象在多個角色中傳遞的場景。

責任鏈模式一般通過層層代理來實現,也就是說它建立在代理模式的基礎上。層代理是什麼意思?比如上面的請假流程,開發經理是動態代理1,部門經理是在開發經理動態代理1的基礎上生成的動態代理2,人事部門則是在動態代理2基礎上生成的動態代理3。如下:

二、攔截器的實現

攔截器1:

public class Iterceptor1 implements Interceptor{
    @Override
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 1 的before()方法");
        return true;
    }

    @Override
    public void around(Object proxy, Object target, Method method, Object[] args) {

    }

    @Override
    public void after(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 1 的after()方法");
    }
}

攔截器2:

public class Iterceptor2 implements Interceptor{
    @Override
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 2 的before()方法");
        return true;
    }

    @Override
    public void around(Object proxy, Object target, Method method, Object[] args) {

    }

    @Override
    public void after(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 2 的after()方法");
    }
}

攔截器3:

public class Iterceptor3 implements Interceptor{
    @Override
    public boolean before(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 3 的before()方法");
        return true;
    }

    @Override
    public void around(Object proxy, Object target, Method method, Object[] args) {

    }

    @Override
    public void after(Object proxy, Object target, Method method, Object[] args) {
        System.out.println("攔截器 3 的after()方法");
    }
}

測試類:

public class DemoTest {
    public static void main(String[] args) {
        BuyHouse proxy1 = (BuyHouse) JDKProxy.getProxy(new FuGuiWang(), "com.wo.domain.proxy.interceptor.Iterceptor1");
        BuyHouse proxy2 = (BuyHouse) JDKProxy.getProxy(proxy1, "com.wo.domain.proxy.interceptor.Iterceptor2");
        BuyHouse proxy3 = (BuyHouse) JDKProxy.getProxy(proxy2, "com.wo.domain.proxy.interceptor.Iterceptor3");
        proxy3.pay();
    }
}
攔截器 3 的before()方法
攔截器 2 的before()方法
攔截器 1 的before()方法
我是王富貴,張狗蛋找的房子我很滿意,我要付錢了。
攔截器 1 的after()方法
攔截器 2 的after()方法
攔截器 3 的after()方法

注意執行順序,before是最後到最前,after是最前到最後。

責任鏈模式的好處是我們可以在傳遞鏈上加上新的攔截器,增加攔截邏輯,很方便實現額外功能,當然缺點也很明,就是或增加反射和代理影響效率。

 

 

 

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