先上圖:
任鏈與命令.png)
接著幾乎就明白了:一些"插件"要么讓你繼承一個(gè)抽象類(lèi)要么讓你實(shí)現(xiàn)一個(gè)接口要么讓你注解一下,比如一個(gè)server服務(wù)器接收到客戶(hù)端發(fā)來(lái)的消息,那么可以用兩種方式增加攔截處理機(jī)制:1,觀察者 2,責(zé)任鏈
如果采用觀察者:
定義一個(gè)攔截器抽象類(lèi)或者接口(主題),增加自定義處理(觀察者),然后一般就是addxxxListener或者就是addxxxIntercepter,消息業(yè)務(wù)處理最終只有一個(gè)業(yè)務(wù)組件類(lèi)來(lái)處理,但是可以定義多個(gè)觀察者。
對(duì)這條消息處理,也就是說(shuō),要把主題傳遞給觀察者,觀察者拿到進(jìn)行一系列處理,觀察者用隊(duì)列,棧或者其它什么數(shù)據(jù)結(jié)構(gòu),最后一個(gè)是真正的業(yè)務(wù)處理,那么在此之前就可以做很多操作了,比如把消息存儲(chǔ)下來(lái),或者把消息的一部分取出來(lái)等等。
如果采用責(zé)任鏈:
一般就是不純的責(zé)任鏈模式,這種方式比如servlet過(guò)濾器就采用的這種方式,還有struts2的攔截器,定義一系列過(guò)濾器鏈,這個(gè)鏈又可以采用不同數(shù)據(jù)結(jié)構(gòu)隊(duì)列 棧 樹(shù)等等,可以把收到的消息進(jìn)行一些額外處理,然后再傳遞給下一個(gè)鏈對(duì)象,最終由用戶(hù)定義的業(yè)務(wù)組件來(lái)處理。而這些鏈用戶(hù)可以自定義,就達(dá)到了這種效果。
以上兩種方式唯一的不同點(diǎn)在于:
采用觀察者模式,那么在中間傳遞的是主題,這個(gè)主題無(wú)法動(dòng)態(tài)的改變,只能做額外處理,但傳遞的還是原本的主題對(duì)象。
采用責(zé)任鏈模式,那么在中間傳遞的過(guò)程中,可以對(duì)主題對(duì)象做一些改變,在傳遞給下一個(gè)鏈對(duì)象。
責(zé)任鏈模式不適應(yīng)于大規(guī)模的系統(tǒng)設(shè)計(jì),一般如果采用觀察者模式,就要對(duì)這種方式進(jìn)行一些增強(qiáng),比如一個(gè)觀察者處理完畢后,包裝這個(gè)主題可用裝飾者模式增強(qiáng)然后返回,讓下一個(gè)觀察者使用這個(gè)主題,對(duì)多個(gè)觀察者還可以使用組合模式,可以把多個(gè)觀察者改為樹(shù)結(jié)構(gòu),采用責(zé)任鏈模式也可以采用這種方法。
代理模式也能實(shí)現(xiàn)這種攔截,也就是aop方式
隨后寫(xiě)幾個(gè)例子,openfire插件以及針對(duì)于spring mvc的一些玩法