亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java設計模式之責任鏈模式

 更新時間:2019年01月16日 09:52:11   作者:Haozz_1994  
今天小編就為大家分享一篇關(guān)于Java設計模式之責任鏈模式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧

設計者往往會用攔截器去代替動態(tài)代理,然后將攔截器的接口提供給開發(fā)者,從而簡化開發(fā)者的開發(fā)難度,但是攔截器可能有多個。舉個例子,一個程序員需要請假一周,如果把請假申請單看成一個對象,那么它需要經(jīng)過項目經(jīng)理、部門經(jīng)理、人事等多個角色的審批,每個角色都有機會通過攔截這個申請單進行審批或者修改。這事就要考慮提供項目經(jīng)理、部門經(jīng)理和人事的處理邏輯,所以需要提供3個攔截器,二傳遞的則是請假申請單。

當一個對象在一條鏈上被多個攔截器處理(攔截器也可以選擇不攔截處理它)時,我們把這樣的設計模式成為責任鏈模式,它用于一個對象在多個角色中傳遞的場景。還是剛才的例子,申請單走到項目經(jīng)理,經(jīng)理可能把申請時間“一周”改為“5天”,從而影響了后面的審批,后面的審批都要根據(jù)前面的結(jié)果進行。這個時候可以考慮用層層代理來實現(xiàn),就是當申請單(target)走到項目經(jīng)理處,使用第一個動態(tài)代理proxy1,。當它走到部門經(jīng)理處,部門經(jīng)理會得到一個在項目經(jīng)理的代理proxy1基礎(chǔ)上生成的proxy2來處理部門經(jīng)理的邏輯。當它走到人事處,會在proxy2的基礎(chǔ)上生成proxy3.如果還有其他角色,依次類推即可,可用下圖來描述攔截邏輯:

我們定義下面的攔截器接口:

/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:15
 * @Description:攔截器接口
 **/
public interface Interceptor {
  boolean before(Object proxy, Object target, Method method,Object[] args);
  void around(Object proxy,Object target,Method method,Object[] args);
  void after(Object proxy,Object target,Method method,Object[] args);
}

再定義3個攔截器:

/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:攔截器1
 **/
public class Interceptor1 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[攔截器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.print("[攔截器1]的after方法");
  }
}
/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:攔截器2
 **/
public class Interceptor2 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[攔截器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.print("[攔截器2]的after方法");
  }
}
/**
 * @Auther: haozz
 * @Date: 2018/5/27 22:19
 * @Description:攔截器3
 **/
public class Interceptor3 implements Interceptor{
  @Override
  public boolean before(Object proxy, Object target, Method method, Object[] args) {
    System.out.print("[攔截器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.print("[攔截器3]的after方法");
  }
}

我們使用上一篇(Java動態(tài)代理之攔截器的應用)中用到的InterceptorJdkProxy類,測試一下這段代碼。如下:

@Test
  public void MyTest(){
    HelloWorld proxy1 = (HelloWorld) InterceptorJdkProxy.bind(new HelloWorldImpl(),"com.csdn.blog.impl.Interceptor1");
    HelloWorld proxy2 = (HelloWorld) InterceptorJdkProxy.bind(proxy1,"com.csdn.blog.impl.Interceptor2");
    HelloWorld proxy3 = (HelloWorld) InterceptorJdkProxy.bind(proxy2,"com.csdn.blog.impl.Interceptor3");
    proxy3.sayHelloWorld();
  }

運行這段diamante后得到這樣的結(jié)果,請注意觀察其方法的執(zhí)行順序:

[攔截器3]的before方法
[攔截器2]的before方法
[攔截器1]的before方法
Hello World
[攔截器1]的after方法
[攔截器2]的after方法
[攔截器3]的after方法

before方法按照最后一個攔截器到第一個攔截器的加載順序運行,而after方法則按照從第一個攔截器到最后一個攔截器的加載順序運行。

從代碼中可見,責任鏈模式的優(yōu)點在于我們可以在傳遞鏈上加入新的攔截器,增加攔截邏輯,其缺點是會增加代理和反射,而代理和反射的性能不高。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接

相關(guān)文章

  • SpringBoot如何進行參數(shù)校驗實例詳解

    SpringBoot如何進行參數(shù)校驗實例詳解

    開發(fā)過程中,后臺的參數(shù)校驗是必不可少的,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何進行參數(shù)校驗的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 一個Java中BigDecimal的問題記錄

    一個Java中BigDecimal的問題記錄

    這篇文章主要給大家介紹了關(guān)于Java中一個BigDecimal問題的相關(guān)資料,通過文中介紹的方法可以很方便的解決BigDecimal進行計算的時候不管怎么計算,最后得到的值都沒有變化的問題,需要的朋友可以參考下
    2021-11-11
  • 基于Java語言MD5加密Base64轉(zhuǎn)換方法

    基于Java語言MD5加密Base64轉(zhuǎn)換方法

    這篇文章主要為大家詳細介紹了基于Java語言的MD5加密Base64轉(zhuǎn)換方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java生成word文檔的示例詳解

    Java生成word文檔的示例詳解

    這篇文章主要為大家詳細介紹了如何利用Java語言生成word文檔,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的小伙伴可以參考一下
    2022-12-12
  • java基于C/S模式實現(xiàn)聊天程序(服務器)

    java基于C/S模式實現(xiàn)聊天程序(服務器)

    這篇文章主要為大家詳細介紹了java基于C/S模式實現(xiàn)聊天程序的服務器篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • springboot中poi使用操作方法

    springboot中poi使用操作方法

    在項目中,有很多對excel的操作,大都數(shù)時候我們都會使用poi工具類,本文將介紹poi的一些使用方法,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • Java元素排序Comparable與Comparator的區(qū)別

    Java元素排序Comparable與Comparator的區(qū)別

    這篇文章主要介紹了Java元素排序Comparable與Comparator的區(qū)別,二者都是頂級的接口,但擁有的方法和用法是不同的,下面我們分別來看看具體是怎樣的區(qū)別吧
    2022-05-05
  • SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例

    SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例

    本文主要介紹了SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java中封裝JDBC工具類的實例分析

    java中封裝JDBC工具類的實例分析

    在本篇內(nèi)容里小編給各位分享了一篇關(guān)于java中封裝JDBC工具類的實例分析,對此有興趣的朋友們可以學習下。
    2021-03-03
  • Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼

    Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼

    這篇文章主要介紹了Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。
    2017-10-10

最新評論