責(zé)任鏈模式
對(duì)于一個(gè)事件,有一系列攔截器可以攔截/處理該事件,將攔截器按照一定順序排列蠕蚜,組成一個(gè)鏈,事件在鏈上傳遞夷家,按順序挨個(gè)由每個(gè)攔截器判斷是否攔截此事件,如果不攔截敏释,可以將事件傳遞給鏈中的下個(gè)攔截器库快,直到某個(gè)攔截器攔截事件或到達(dá)責(zé)任鏈尾部。
Android View的事件分發(fā)機(jī)制
View
的事件分發(fā)機(jī)制是典型的責(zé)任鏈模式钥顽,當(dāng)觸發(fā)一個(gè)Touch
事件時(shí)义屏,Touch
事件從布局最外層的ViewGroup
開(kāi)始傳遞,每個(gè)ViewGroup
都是一個(gè)攔截器耳鸯,可以攔截Touch
事件湿蛔,當(dāng)ViewGroup
攔截事件后,它的子View
就不會(huì)收到Touch
事件县爬,分發(fā)結(jié)束阳啥。
View
有dispatchTouchEvent()
、onTouchEvent()
這兩個(gè)方法财喳,和mOnTouchListener
察迟、mOnClickListener
這兩個(gè)變量斩狱,ViewGroup
比View
多了個(gè)onInterceptTouchEvent()
方法。
假設(shè)ViewGroup
A包含了View
B扎瓶,當(dāng)觸發(fā)一個(gè)Touch
事件時(shí)所踊,整個(gè)事件的傳播流程如下圖:
OKHTTP中的責(zé)任鏈
OKHTTP
的核心也是責(zé)任鏈模式,OKHTTP
定義了很多攔截器用于分步處理網(wǎng)絡(luò)請(qǐng)求概荷,下面是一些常用類及請(qǐng)求處理流程:
Request
類封裝了網(wǎng)絡(luò)請(qǐng)求秕岛,包括url、請(qǐng)求方法误证、請(qǐng)求頭继薛、請(qǐng)求體等信息。
Response
類封裝了網(wǎng)絡(luò)響應(yīng)愈捅,包括原始請(qǐng)求遏考、響應(yīng)碼、響應(yīng)頭蓝谨、響應(yīng)體等信息灌具。
Call
類表示請(qǐng)求的過(guò)程,通過(guò)Call
對(duì)象執(zhí)行網(wǎng)絡(luò)請(qǐng)求的一系列步驟譬巫,RealCall
是Call
接口的唯一實(shí)現(xiàn)類咖楣,通過(guò)OkHttpClient
的newCall()
方法創(chuàng)建,通過(guò)Call
對(duì)象執(zhí)行同步請(qǐng)求或異步請(qǐng)求芦昔。
OkHttpClient
是一個(gè)創(chuàng)建Call
對(duì)象的工廠截歉,通常全局唯一,存放用戶自定義配置烟零,根據(jù)配置創(chuàng)建Call
對(duì)象。
Dispatcher
用于調(diào)度所有請(qǐng)求的請(qǐng)求過(guò)程咸作,包含一個(gè)線程池锨阿,用于執(zhí)行異步請(qǐng)求。
Interceptor
接口表示攔截器记罚,它有多個(gè)不同功能的實(shí)現(xiàn)類墅诡,例如用戶自定義的攔截器、用于超時(shí)重試桐智、轉(zhuǎn)換請(qǐng)求頭末早、緩存、連接網(wǎng)絡(luò)说庭、真正請(qǐng)求服務(wù)器的各種攔截器然磷。
一個(gè)Request
請(qǐng)求在攔截器組成的責(zé)任鏈上不斷傳遞,任何一個(gè)攔截器都可以攔截請(qǐng)求直接返回響應(yīng)刊驴,也可以對(duì)請(qǐng)求進(jìn)行一定處理后交由下一個(gè)攔截器處理姿搜,直到有攔截器攔截該請(qǐng)求寡润。如下圖所示:
與裝飾者模式的異同
相同點(diǎn):
裝飾者模式和責(zé)任鏈模式都可以有任意多個(gè)裝飾者/攔截器。
裝飾者/攔截器可以在最終處理的前/后添加自己的處理邏輯舅柜。
不同點(diǎn):
裝飾者模式必須要有一個(gè)被裝飾者梭纹,裝飾者裝飾被裝飾者,但裝飾者的類型永遠(yuǎn)不變致份,比如你不可能把一個(gè)
InputStream
裝飾成一個(gè)OutputStream
变抽。而責(zé)任鏈模式是對(duì)事件的處理,重要的是處理的過(guò)程而不是返回的結(jié)果氮块,可能沒(méi)人處理绍载,也可能返回一個(gè)其他類型的值,比如OKHTTP
的責(zé)任鏈接收一個(gè)Request
返回一個(gè)Response
雇锡。裝飾者模式中任意一個(gè)裝飾者都會(huì)生效逛钻,而責(zé)任鏈模式中部分?jǐn)r截器可能沒(méi)有機(jī)會(huì)處理事件。