最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之責(zé)任鏈模式

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

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

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

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

/**
 * @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個(gè)攔截器:

/**
 * @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動(dòng)態(tài)代理之?dāng)r截器的應(yīng)用)中用到的InterceptorJdkProxy類(lèi),測(cè)試一下這段代碼。如下:

@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();
  }

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

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

before方法按照最后一個(gè)攔截器到第一個(gè)攔截器的加載順序運(yùn)行,而after方法則按照從第一個(gè)攔截器到最后一個(gè)攔截器的加載順序運(yùn)行。

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

總結(jié)

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

相關(guān)文章

  • Java 實(shí)現(xiàn)麥克風(fēng)自動(dòng)錄音

    Java 實(shí)現(xiàn)麥克風(fēng)自動(dòng)錄音

    這篇文章主要介紹了Java 實(shí)現(xiàn)麥克風(fēng)自動(dòng)錄音的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • 詳解怎么用Java的super關(guān)鍵字

    詳解怎么用Java的super關(guān)鍵字

    今天帶大家學(xué)習(xí)Java中super關(guān)鍵字是怎么用的,文中有非常詳細(xì)的介紹,對(duì)正在學(xué)習(xí)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • PowerJob的OhMyClassLoader工作流程源碼解讀

    PowerJob的OhMyClassLoader工作流程源碼解讀

    這篇文章主要介紹了PowerJob的OhMyClassLoader工作流程源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Fluent Mybatis讓你擺脫Xml文件的技巧

    Fluent Mybatis讓你擺脫Xml文件的技巧

    Fluent-Mybatis類(lèi)似于Mybatis-Plus是對(duì)Mybatis進(jìn)一步的封裝,可以只用一個(gè)實(shí)體類(lèi)對(duì)象,通過(guò)代碼生成器,在編譯的過(guò)程中生成所需要的各類(lèi)文件,簡(jiǎn)化了項(xiàng)目的基礎(chǔ)構(gòu)建,提高開(kāi)發(fā)效率,本文重點(diǎn)給大家介紹Fluent Mybaits讓你擺脫Xml文件的技巧,一起看看吧
    2021-08-08
  • Java的中l(wèi)ombok下的@Builder注解用法詳解

    Java的中l(wèi)ombok下的@Builder注解用法詳解

    這篇文章主要介紹了Java的中l(wèi)ombok下的@Builder注解用法詳解,lombok注解在java進(jìn)行編譯時(shí)進(jìn)行代碼的構(gòu)建,對(duì)于java對(duì)象的創(chuàng)建工作它可以更優(yōu)雅,不需要寫(xiě)多余的重復(fù)的代碼,在出現(xiàn)lombok之后,對(duì)象的創(chuàng)建工作更提供Builder方法,需要的朋友可以參考下
    2023-11-11
  • Java錯(cuò)誤:進(jìn)行語(yǔ)法分析時(shí)已到達(dá)文件結(jié)尾的解決

    Java錯(cuò)誤:進(jìn)行語(yǔ)法分析時(shí)已到達(dá)文件結(jié)尾的解決

    這篇文章主要介紹了Java錯(cuò)誤:進(jìn)行語(yǔ)法分析時(shí)已到達(dá)文件結(jié)尾的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring?data?jpa緩存機(jī)制使用總結(jié)

    Spring?data?jpa緩存機(jī)制使用總結(jié)

    這篇文章主要介紹了Spring?data?jpa緩存機(jī)制使用總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解IDEA中MAVEN項(xiàng)目打JAR包的簡(jiǎn)單方法

    詳解IDEA中MAVEN項(xiàng)目打JAR包的簡(jiǎn)單方法

    本篇文章主要介紹了詳解IDEA中MAVEN項(xiàng)目打JAR包的簡(jiǎn)單方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 基于JDK8總結(jié)java中的interrupt

    基于JDK8總結(jié)java中的interrupt

    本文是基于JDK8總結(jié)java中的interrupt知識(shí),需要的朋友可以參考下
    2017-12-12
  • Java的RxJava庫(kù)操作符的用法及實(shí)例講解

    Java的RxJava庫(kù)操作符的用法及實(shí)例講解

    RxJava由于提供異步和基于事件的支持在Android開(kāi)發(fā)者中獲得了不少人氣,這里我們就來(lái)看一下Java的RxJava庫(kù)操作符的用法及實(shí)例講解,需要的朋友可以參考下
    2016-06-06

最新評(píng)論

木兰县| 石狮市| 福贡县| 镇远县| 商丘市| 通化市| 垦利县| 吴忠市| 兰西县| 林周县| 会宁县| 佛山市| 黄大仙区| 孟津县| 滦南县| 宜昌市| 电白县| 祁阳县| 滨州市| 海晏县| 思茅市| 伊金霍洛旗| 县级市| 东光县| 辉县市| 五原县| 鄂温| 泽库县| 江津市| 泸溪县| 伊金霍洛旗| 漳浦县| 疏附县| 淮阳县| 秦安县| 阿拉善左旗| 玉树县| 康保县| 上杭县| 崇信县| 邯郸市|