一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java 中責任鏈模式實現的三種方式

Java 中責任鏈模式實現的三種方式

2020-12-31 15:45atheva Java教程

本文重點給大家介紹java中如何編寫責任鏈模式。主要從下面3個框架中的代碼中介紹。非常不錯,需要的朋友參考下吧

責任鏈模式

責任鏈模式的定義:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關系, 將這個對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理他為止。這里就不再過多的介紹什么是責任鏈模式,主要來說說java中如何編寫。主要從下面3個框架中的代碼中介紹。

  • servlet中的filter
  • dubbo中的filter
  • mybatis中的plugin 這3個框架在實現責任鏈方式不盡相同。

servlet中的Filter

servlet中分別定義了一個 Filter和FilterChain的接口,核心代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public final class ApplicationFilterChain implements FilterChain {
  private int pos = 0; //當前執行filter的offset
  private int n; //當前filter的數量
  private ApplicationFilterConfig[] filters; //filter配置類,通過getFilter()方法獲取Filter
  private Servlet servlet
  @Override
  public void doFilter(ServletRequest request, ServletResponse response) {
    if (pos < n) {
      ApplicationFilterConfig filterConfig = filters[pos++];
      Filter filter = filterConfig.getFilter();
      filter.doFilter(request, response, this);
    } else {
      // filter都處理完畢后,執行servlet
      servlet.service(request, response);
    }
  }
}

代碼還算簡單,結構也比較清晰,定義一個Chain,里面包含了Filter列表和servlet,達到在調用真正servlet之前進行各種filter邏輯。

Java 中責任鏈模式實現的三種方式

Dubbo中的Filter

Dubbo在創建Filter的時候是另外一個方法,通過把Filter封裝成 Invoker的匿名類,通過鏈表這樣的數據結構來完成責任鏈,核心代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private static <T> Invoker<T> buildInvokerChain(final Invoker<T> invoker, String key, String group) {
  Invoker<T> last = invoker;
  //只獲取滿足條件的Filter
  List<Filter> filters = ExtensionLoader.getExtensionLoader(Filter.class).getActivateExtension(invoker.getUrl(), key, group);
  if (filters.size() > 0) {
    for (int i = filters.size() - 1; i >= 0; i --) {
      final Filter filter = filters.get(i);
      final Invoker<T> next = last;
      last = new Invoker<T>() {
        ...
        public Result invoke(Invocation invocation) throws RpcException {
          return filter.invoke(next, invocation);
        }
        ...
      };
    }
  }
  return last;
}

Dubbo的責任鏈就沒有類似FilterChain這樣的類吧Filter和調用Invoker結合起來,而是通過創建一個鏈表,調用的時候我們只知道第一個節點,每個節點包含了下一個調用的節點信息。 這里的雖然Invoker封裝Filter沒有顯示的指定next,但是通過java匿名類和final的機制達到同樣的效果。

Java 中責任鏈模式實現的三種方式

Mybatis中的Plugin

Mybatis可以配置各種Plugin,無論是官方提供的還是自己定義的,Plugin和Filter類似,就在執行Sql語句的時候做一些操作。Mybatis的責任鏈則是通過動態代理的方式,使用Plugin代理實際的Executor類。(這里實際還使用了組合模式,因為Plugin可以嵌套代理),核心代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Plugin implements InvocationHandler{
  private Object target;
  private Interceptor interceptor;
  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
    if (滿足代理條件) {
      return interceptor.intercept(new Invocation(target, method, args));
    }
    return method.invoke(target, args);  
  }
  //對傳入的對象進行代理,可能是實際的Executor類,也可能是Plugin代理類
  public static Object wrap(Object target, Interceptor interceptor) {
    Class<?> type = target.getClass();
    Class<?>[] interfaces = getAllInterfaces(type, signatureMap);
    if (interfaces.length > 0) {
      return Proxy.newProxyInstance(
          type.getClassLoader(),
          interfaces,
          new Plugin(target, interceptor, signatureMap));
    }
    return target;
  }
}

 簡單的示意圖如下:

Java 中責任鏈模式實現的三種方式

總結

這里簡單介紹了Servlet、Dubbo、Mybatis對責任鏈模式的不同實現手段,其中Servlet是相對比較清晰,又易于實現的方式,而Dubbo和Mybatis則適合在原有代碼基礎上,增加責任鏈模式代碼改動量最小的。

以上所述是小編給大家介紹的Java 中責任鏈模式實現的三種方式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://www.cnblogs.com/lizo/p/7503862.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品成人片深夜 | 日韩精品视频观看 | jizz漫画| 国产激情一区二区三区四区 | 母爱成瘾在线观看 | 91免费精品国自产拍在线可以看 | 国色天香社区视频免费高清在线观看 | 岛国虐乳紧缚媚药调教 | 男人的天堂视频 | 乌克兰呦12~14 | 99久久精品无码一区二区毛片 | 免费大秀视频在线播放 | 免费yjsp妖精com | 久久午夜一区二区 | 欧美影院一区二区三区 | 数学老师扒开腿让我爽快 | 福利姬 magnet | 国产欧美国产综合第一区 | 5g影院天天影院天天爽影院网站 | 关晓彤被调教出奶水的视频 | 亚洲娇小videos | 2022av小四郎的最新地址 | 亚洲国产成人精品 | 国产大胆歌舞团网站 | 青青国产成人久久激情911 | 男同桌脱我奶罩吸我奶作文 | 九九精品免视频国产成人 | 欧美帅老头oldmangay | 午夜精品久久久久久中宇 | 欧美综合精品一区二区三区 | 欧美日韩在线观看一区二区 | 精品一区二区三区五区六区 | 青青草原手机在线视频 | 国产裸舞福利资源在线视频 | 黄网在线观看免费网站台湾swag | 15同性同志18 | 国内精品视频一区二区三区八戒 | 久久无码人妻中文国产 | 欧美三级做爰全过程 | 亚洲人成伊人成综合网久久 | 婷婷色天使在线视频观看 |