門面設計模式
門面設計模式的原理
這麼多場合都用到了這種設計模式,那這種設計模式究竟能有什麼作用呢?顧名思義,就是將乙個東西封裝成乙個門面好與人家更容易進行交流,就像乙個國家的***一樣。
這種設計模式主要用在乙個大的系統中有多個子系統組成時,這多個子系統肯定要涉及到相互通訊,但是每個子系統又不能將自己的內部資料過多的暴露給其它系統,不然就沒有必要劃分子系統了。每個子系統都會設計乙個門面,把別的系統感興趣的資料封裝起來,通過這個門面來進行訪問。這就是門面設計模式存在的意義。
門面設計模式示意圖如下:
圖 1. 門面示意圖
client 只能訪問到 façade 中提供的資料是門面設計模式的關鍵,至於 client 如何訪問 façade 和 subsystem 如何提供 façade 門面設計模式並沒有規定死。
tomcat 的門面設計模式示例
tomcat 中門面設計模式使用的很多,因為 tomcat 中有很多不同元件,每個元件要相互互動資料,用門面模式隔離資料是個很好的方法。
下面是 request 上使用的門面設計模式:
圖 2. request 的門面設計模式類圖
從圖中可以看出 httprequestfacade 類封裝了 httprequest 介面能夠提供資料,通過 httprequestfacade 訪問到的資料都被**到 httprequest 中,通常被封裝的物件都被設為 private 或者 protected 訪問修飾,以防止在 façade 中被直接訪問。
回頁首
觀察者設計模式
這種設計模式也是常用的設計方法通常也叫發布 - 訂閱模式,也就是事件監聽機制,通常在某個事件發生的前後會觸發一些操作。
觀察者模式的原理
觀察者模式原理也很簡單,就是你在做事的時候旁邊總有乙個人在盯著你,當你做的事情是它感興趣的時候,它就會跟著做另外一些事情。但是盯著你的人必須要到你那去登記,不然你無法通知它。觀察者模式通常包含下面這幾個角色:
tomcat 的觀察者模式示例
tomcat 中觀察者模式也有多處使用,前面講的控制項生命週期的 lifecycle 就是這種模式的體現,還有對 servlet 例項的建立、session 的管理、container 等都是同樣的原理。下面主要看一下 lifecycle 的具體實現。
lifecycle 的觀察者模式結構圖:
圖 3. lifecycle 的觀察者模式結構圖
上面的結構圖中,lifecyclelistener 代表的是抽象觀察者,它定義乙個 lifecycleevent 方法,這個方法就是當主題變化時要執行的方法。 serverlifecyclelistener 代表的是具體的觀察者,它實現了 lifecyclelistener 介面的方法,就是這個具體的觀察者具體的實現方式。lifecycle 介面代表的是抽象主題,它定義了管理觀察者的方法和它要所做的其它方法。而 standardserver 代表的是具體主題,它實現了抽象主題的所有方法。這裡 tomcat 對觀察者做了擴充套件,增加了另外兩個類:lifecyclesupport、lifecycleevent,它們作為輔助類擴充套件了觀察者的功能。lifecycleevent 使得可以定義事件類別,不同的事件可區別處理,更加靈活。lifecyclesupport 類**了主題對多觀察者的管理,將這個管理抽出來統一實現,以後如果修改只要修改 lifecyclesupport 類就可以了,不需要去修改所有具體主題,因為所有具體主題的對觀察者的操作都被**給 lifecyclesupport 類了。這可以認為是觀察者模式的改進版。
lifecyclesupport 呼叫觀察者的方法**如下:
清單 1. lifecyclesupport 中的 firelifecycleevent 方法
public void firelifecycleevent(string type, object data)主題是怎麼通知觀察者呢?看下面**:for (int i = 0; i < interested.length; i++)
interested[i].lifecycleevent(event);
}
清單 2. 容器中的 start 方法
public void start() throws lifecycleexception回頁首}lifecycle.firelifecycleevent(after_start_event, null);
}
命令設計模式
前面把 tomcat 中兩個核心元件 connector 和 container,比作一對夫妻。男的將接受過來的請求以命令的方式交給女主人。對應到 connector 和 container,connector 也是通過命令模式呼叫 container 的。
命令模式的原理
命令模式主要作用就是封裝命令,把發出命令的責任和執行命令的責任分開。也是一種功能的分工。不同的模組可以對同乙個命令做出不同解釋。
下面是命令模式通常包含下面幾個角色:
tomcat 中的命令模式的示例
tomcat 中命令模式在 connector 和 container 元件之間有體現,tomcat 作為乙個應用伺服器,無疑會接受到很多請求,如何分配和執行這些請求是必須的功能。
下面看一下 tomcat 是如何實現命令模式的,下面是 tomcat 命令模式的結構圖:
圖 4. tomcat 命令模式的結構圖
connector 作為抽象請求者,httpconnector 作為具體請求者。httpprocessor 作為命令。container 作為命令的抽象接受者,containerbase 作為具體的接受者。客戶端就是應用伺服器 server 元件了。server 首先建立命令請求者 httpconnector 物件,然後建立命令 httpprocessor 命令物件。再把命令物件交給命令接受者 containerbase 容器來處理命令。命令的最終是被 tomcat 的 container 執行的。命令可以以佇列的方式進來,container 也可以以不同的方式來處理請求,如 http1.0 協議和 http1.1 的處理方式就會不同。
回頁首
責任鏈模式
tomcat 中乙個最容易發現的設計模式就是責任鏈模式,這個設計模式也是 tomcat 中 container 設計的基礎,整個容器的就是通過乙個鏈連線在一起,這個鏈一直將請求正確的傳遞給最終處理請求的那個 servlet。
責任鏈模式的原理
責任鏈模式,就是很多物件有每個物件對其下家的引用而連線起來形成一條鏈,請求在這條鏈上傳遞,直到鏈上的某個物件處理此請求,或者每個物件都可以處理請求,並傳給下一家,直到最終鏈上每個物件都處理完。這樣可以不影響客戶端而能夠在鏈上增加任意的處理節點。
通常責任鏈模式包含下面幾個角色:
tomcat 中責任鏈模式示例
tomcat 中責任鏈模式的類結構圖如下:
圖 5. tomcat 責任鏈模式的結構圖
上圖基本描述了四個子容器使用責任鏈模式的類結構圖,對應的責任鏈模式的角色,container 扮演抽象處理者角色,具體處理者由 standardengine 等子容器扮演。與標準的責任鏈不同的是,這裡引入了 pipeline 和 valve 介面。他們有什麼作用呢?
實際上 pipeline 和 valve 是擴充套件了這個鏈的功能,使得在鏈往下傳遞過程中,能夠接受外界的干預。pipeline 就是連線每個子容器的管子,裡面傳遞的 request 和 response 物件好比管子裡流的水,而 valve 就是這個管子上開的乙個個小口子,讓你有機會能夠接觸到裡面的水,做一些額外的事情。
為了防止水被引出來而不能流到下乙個容器中,每一段管子最後總有乙個節點保證它一定能流到下乙個子容器,所以每個容器都有乙個 standard***valve。只要涉及到這種有鏈式是處理流程這是乙個非常值得借鑑的模式。
Tomcat工作原理2
門面設計模式 門面設計模式的原理 這麼多場合都用到了這種設計模式,那這種設計模式究竟能有什麼作用呢?顧名思義,就是將乙個東西封裝成乙個門面好與人家更容易進行交流,就像乙個國家的 一樣。這種設計模式主要用在乙個大的系統中有多個子系統組成時,這多個子系統肯定要涉及到相互通訊,但是每個子系統又不能將自己的...
Tomcat工作原理
tomcat內存在乙個process連線池,有請求過來會去連線池內獲取process物件對該請求進行處理,連線池有最小連線數和最大連線數,當前請求數超過最大連線數後超出的連線請求將會被丟棄,如果最大連線數設定為負數,則表示無最大連線數限制。乙個process物件接收到請求後不對請求做任何處理,直接建...
Tomcat工作原理
總體結構 tomcat 的結構很複雜,但是 tomcat 也非常的模組化,找到了 tomcat 最核心的模組,您就抓住了 tomcat 的 七寸 下面是 tomcat 的總體結構圖 從 上圖中可以看出 tomcat 的心臟是兩個元件 connector 和 container,關於這兩個元件將在後面...