乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Tomcat 系統(tǒng)架構與設計模式,第 2 部分: 設計模式分析

       gyb98 2010-12-11

      門面設計模式

      門面設計模式在 Tomcat 中有多處使用,在 Request 和 Response 對象封裝中、Standard Wrapper 到 ServletConfig 封裝中、ApplicationContext 到 ServletContext 封裝中等都用到了這種設計模式。

      門面設計模式的原理

      這么多場合都用到了這種設計模式,那這種設計模式究竟能有什么作用呢?顧名思義,就是將一個東西封裝成一個門面好與人家更容易進行交流,就像一個國家的外交部一樣。

      這種設計模式主要用在一個大的系統(tǒng)中有多個子系統(tǒng)組成時,這多個子系統(tǒng)肯定要涉及到相互通信,但是每個子系統(tǒng)又不能將自己的內(nèi)部數(shù)據(jù)過多的暴 露給其它系統(tǒng),不然就沒有必要劃分子系統(tǒng)了。每個子系統(tǒng)都會設計一個門面,把別的系統(tǒng)感興趣的數(shù)據(jù)封裝起來,通過這個門面來進行訪問。這就是門面設計模式 存在的意義。

      門面設計模式示意圖如下:


      圖 1. 門面示意圖
      圖 1. 門面示意圖

      Client 只能訪問到 Fa?ade 中提供的數(shù)據(jù)是門面設計模式的關鍵,至于 Client 如何訪問 Fa?ade 和 Subsystem 如何提供 Fa?ade 門面設計模式并沒有規(guī)定死。

      Tomcat 的門面設計模式示例

      Tomcat 中門面設計模式使用的很多,因為 Tomcat 中有很多不同組件,每個組件要相互交互數(shù)據(jù),用門面模式隔離數(shù)據(jù)是個很好的方法。

      下面是 Request 上使用的門面設計模式:


      圖 2. Request 的門面設計模式類圖
      圖 2. request 的門面設計模式類圖

      從圖中可以看出 HttpRequestFacade 類封裝了 HttpRequest 接口能夠提供數(shù)據(jù),通過 HttpRequestFacade 訪問到的數(shù)據(jù)都被代理到 HttpRequest 中,通常被封裝的對象都被設為 Private 或者 Protected 訪問修飾,以防止在 Fa?ade 中被直接訪問。


      觀察者設計模式

      這種設計模式也是常用的設計方法通常也叫發(fā)布 - 訂閱模式,也就是事件監(jiān)聽機制,通常在某個事件發(fā)生的前后會觸發(fā)一些操作。

      觀察者模式的原理

      觀察者模式原理也很簡單,就是你在做事的時候旁邊總有一個人在盯著你,當你做的事情是它感興趣的時候,它就會跟著做另外一些事情。但是盯著你的人必須要到你那去登記,不然你無法通知它。觀察者模式通常包含下面這幾個角色:

      • Subject 就是抽象主題:它負責管理所有觀察者的引用,同時定義主要的事件操作。
      • ConcreteSubject 具體主題:它實現(xiàn)了抽象主題的所有定義的接口,當自己發(fā)生變化時,會通知所有觀察者。
      • Observer 觀察者:監(jiān)聽主題發(fā)生變化相應的操作接口。

      Tomcat 的觀察者模式示例

      Tomcat 中觀察者模式也有多處使用,前面講的控制組件生命周期的 Lifecycle 就是這種模式的體現(xiàn),還有對 Servlet 實例的創(chuàng)建、Session 的管理、Container 等都是同樣的原理。下面主要看一下 Lifecycle 的具體實現(xiàn)。

      Lifecycle 的觀察者模式結構圖:


      圖 3. Lifecycle 的觀察者模式結構圖
      圖 3. lifecycle 的觀察者模式結構圖

      上面的結構圖中,LifecycleListener 代表的是抽象觀察者,它定義一個 lifecycleEvent 方法,這個方法就是當主題變化時要執(zhí)行的方法。 ServerLifecycleListener 代表的是具體的觀察者,它實現(xiàn)了 LifecycleListener 接口的方法,就是這個具體的觀察者具體的實現(xiàn)方式。Lifecycle 接口代表的是抽象主題,它定義了管理觀察者的方法和它要所做的其它方法。而 StandardServer 代表的是具體主題,它實現(xiàn)了抽象主題的所有方法。這里 Tomcat 對觀察者做了擴展,增加了另外兩個類:LifecycleSupport、LifecycleEvent,它們作為輔助類擴展了觀察者的功能。 LifecycleEvent 使得可以定義事件類別,不同的事件可區(qū)別處理,更加靈活。LifecycleSupport 類代理了主題對多觀察者的管理,將這個管理抽出來統(tǒng)一實現(xiàn),以后如果修改只要修改 LifecycleSupport 類就可以了,不需要去修改所有具體主題,因為所有具體主題的對觀察者的操作都被代理給 LifecycleSupport 類了。這可以認為是觀察者模式的改進版。

      LifecycleSupport 調(diào)用觀察者的方法代碼如下:


      清單 1. LifecycleSupport 中的 fireLifecycleEvent 方法
                  public void fireLifecycleEvent(String type, Object data) {
                  LifecycleEvent event = new LifecycleEvent(lifecycle, type, data);
                  LifecycleListener interested[] = null;
                  synchronized (listeners) {
                  interested = (LifecycleListener[]) listeners.clone();
                  }
                  for (int i = 0; i < interested.length; i++)
                  interested[i].lifecycleEvent(event);
                  }
                  

      主題是怎么通知觀察者呢?看下面代碼:


      清單 2. 容器中的 start 方法
                  public void start() throws LifecycleException {
                  lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
                  lifecycle.fireLifecycleEvent(START_EVENT, null);
                  started = true;
                  synchronized (services) {
                  for (int i = 0; i < services.length; i++) {
                  if (services[i] instanceof Lifecycle)
                  ((Lifecycle) services[i]).start();
                  }
                  }
                  lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
                  }
                  


      命令設計模式

      前面把 Tomcat 中兩個核心組件 Connector 和 Container,比作一對夫妻。男的將接受過來的請求以命令的方式交給女主人。對應到 Connector 和 Container,Connector 也是通過命令模式調(diào)用 Container 的。

      命令模式的原理

      命令模式主要作用就是封裝命令,把發(fā)出命令的責任和執(zhí)行命令的責任分開。也是一種功能的分工。不同的模塊可以對同一個命令做出不同解釋。

      下面是命令模式通常包含下面幾個角色:

      • Client:創(chuàng)建一個命令,并決定接受者
      • Command 命令:命令接口定義一個抽象方法
      • ConcreteCommand:具體命令,負責調(diào)用接受者的相應操作
      • Invoker 請求者:負責調(diào)用命令對象執(zhí)行請求
      • Receiver 接受者:負責具體實施和執(zhí)行一次請求

      Tomcat 中的命令模式的示例

      Tomcat 中命令模式在 Connector 和 Container 組件之間有體現(xiàn),Tomcat 作為一個應用服務器,無疑會接受到很多請求,如何分配和執(zhí)行這些請求是必須的功能。

      下面看一下 Tomcat 是如何實現(xiàn)命令模式的,下面是 Tomcat 命令模式的結構圖:


      圖 4. Tomcat 命令模式的結構圖
      圖 4. tomcat 命令模式的結構圖

      Connector 作為抽象請求者,HttpConnector 作為具體請求者。HttpProcessor 作為命令。Container 作為命令的抽象接受者,ContainerBase 作為具體的接受者??蛻舳司褪菓梅掌?Server 組件了。Server 首先創(chuàng)建命令請求者 HttpConnector 對象,然后創(chuàng)建命令 HttpProcessor 命令對象。再把命令對象交給命令接受者 ContainerBase 容器來處理命令。命令的最終是被 Tomcat 的 Container 執(zhí)行的。命令可以以隊列的方式進來,Container 也可以以不同的方式來處理請求,如 HTTP1.0 協(xié)議和 HTTP1.1 的處理方式就會不同。


      責任鏈模式

      Tomcat 中一個最容易發(fā)現(xiàn)的設計模式就是責任鏈模式,這個設計模式也是 Tomcat 中 Container 設計的基礎,整個容器的就是通過一個鏈連接在一起,這個鏈一直將請求正確的傳遞給最終處理請求的那個 Servlet。

      責任鏈模式的原理

      責任鏈模式,就是很多對象有每個對象對其下家的引用而連接起來形成一條鏈,請求在這條鏈上傳遞,直到鏈上的某個對象處理此請求,或者每個對象都可以處理請求,并傳給下一家,直到最終鏈上每個對象都處理完。這樣可以不影響客戶端而能夠在鏈上增加任意的處理節(jié)點。

      通常責任鏈模式包含下面幾個角色:

      • Handler(抽象處理者):定義一個處理請求的接口
      • ConcreteHandler(具體處理者):處理請求的具體類,或者傳給下家

      Tomcat 中責任鏈模式示例

      在 tomcat 中這種設計模式幾乎被完整的使用,tomcat 的容器設置就是責任鏈模式,從 Engine 到 Host 再到 Context 一直到 Wrapper 都是通過一個鏈傳遞請求。

      Tomcat 中責任鏈模式的類結構圖如下:


      圖 5. Tomcat 責任鏈模式的結構圖
      圖 5. tomcat 責任鏈模式的結構圖

      上圖基本描述了四個子容器使用責任鏈模式的類結構圖,對應的責任鏈模式的角色,Container 扮演抽象處理者角色,具體處理者由 StandardEngine 等子容器扮演。與標準的責任鏈不同的是,這里引入了 Pipeline 和 Valve 接口。他們有什么作用呢?

      實際上 Pipeline 和 Valve 是擴展了這個鏈的功能,使得在鏈往下傳遞過程中,能夠接受外界的干預。Pipeline 就是連接每個子容器的管子,里面?zhèn)鬟f的 Request 和 Response 對象好比管子里流的水,而 Valve 就是這個管子上開的一個個小口子,讓你有機會能夠接觸到里面的水,做一些額外的事情。

      為了防止水被引出來而不能流到下一個容器中,每一段管子最后總有一個節(jié)點保證它一定能流到下一個子容器,所以每個容器都有一個 StandardXXXValve。只要涉及到這種有鏈式是處理流程這是一個非常值得借鑒的模式。



        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多