激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 91久久国产| 国产精品亚洲yourport | 中文字幕亚洲情99在线 | 免费国产成人高清在线看软件 | 51国产偷自视频区视频小蝌蚪 | 成人免费av在线播放 | 曰本三级日本三级日本三级 | 91社区在线观看 | 香蕉视频1024 | 91中文在线 | 91网在线播放 | 成人福利视频在 | 欧美精品一区二区免费 | 欧美精品激情视频 | 青青草成人av | 爽爽视频免费看 | 欧美国产一级片 | 久草最新| 日韩视频一区二区三区在线观看 | 精品一区二区电影 | 粉嫩粉嫩一区二区三区在线播放 | 欧美性黄| av在线免费不卡 | 欧美性生交xxxxx久久久 | 精品一区二区电影 | 欧美成人一区二区三区 | 黄色大片网站在线观看 | 99欧美视频 | 72pao成人国产永久免费视频 | 中国女警察一级毛片视频 | 欧美视频网| 国产91久久久 | 国产精品久久久免费看 | 91国内精品久久久久免费影院 | 日本不卡一区二区在线观看 | 国产精品高潮99久久久久久久 | 亚洲免费资源 | 男女羞羞视频 | 久久小视频 | 免费一级毛片免费播放 | 中文字幕在线播放第一页 |