責(zé)任鏈模式
理解(what):
????????責(zé)任鏈模式就是某對(duì)象對(duì)其他對(duì)象的引用,其他對(duì)象再引用其他對(duì)象,形成一個(gè)鏈狀的結(jié)構(gòu),可以是環(huán)形、直線等。發(fā)起的請(qǐng)求在這個(gè)責(zé)任鏈中傳遞,直到鏈上某一個(gè)節(jié)點(diǎn)(對(duì)象)處理了該請(qǐng)求。那么可以理解,發(fā)起請(qǐng)求的客戶端并不知道是哪個(gè)節(jié)點(diǎn)處理了請(qǐng)求,它只是把請(qǐng)求發(fā)送而不管其他的事。
優(yōu)點(diǎn)(when,why):
? ? ? ? 1.發(fā)送者與接收者之間的耦合度降低(解耦)
? ? ? ? 2.可以靈活添加新的責(zé)任鏈中的對(duì)象
缺點(diǎn):
? ? ? ? 1.不能保證請(qǐng)求一定被接收
? ? ? ? 2.一定程度上影響性能
應(yīng)用場(chǎng)景(where):
? ? ? ? 1.jsp servlet 的filter
? ? ? ? 2.dom事件冒泡機(jī)制
? ??????????????事件冒泡機(jī)制的流程
?????????????????如果div下的form表單存在button,且給這三個(gè)dom都綁定click事件(簡(jiǎn)單的+1功能),那么當(dāng)按鈕點(diǎn)擊后,就會(huì)發(fā)現(xiàn)+3,這是因?yàn)椴东@到button的click事件,再向上傳播到form,此時(shí)因?yàn)閒orm也綁定了click事件,然后在從form開始冒泡到div,div也綁定了click事件,所以又加了1.
? ? ? ? ? ? ? ? 什么是事件委托?
? ? ? ? ? ? ? ? ? ? 在一個(gè)課間操,大家都餓了,想要去小賣部買吃的,但是一個(gè)一個(gè)人去買效率太低了,于是大家想了個(gè)辦法,委托班長下去幫忙買,班長記下大家要的零食,買完之后再把零食發(fā)給大家,這就是事件委托。
? ??????????????與事件委托的關(guān)系
? ? ? ? ? ? ? ? ? ? 如果將body綁定了addEventListener,(body內(nèi)有div處理值+1,div內(nèi)有form處理值+2,form內(nèi)有button處理值+3),本來每個(gè)節(jié)點(diǎn)都有要處理的函數(shù),這樣代碼寫起來就很冗余,所以我們將處理的函數(shù)都交給了父節(jié)點(diǎn)body,也就是其他節(jié)點(diǎn)的響應(yīng)邏輯都委托給body,讓body來完成相應(yīng)邏輯,自己不實(shí)現(xiàn)邏輯,這就是事件委托模式
? ??????????????如何避免多次觸發(fā)click
? ? ? ? ? ? ? ? ? ? 1.在事件綁定觸發(fā)后,在函數(shù)體內(nèi)使用removeEventListener("click",點(diǎn)擊方法,false)
? ? ? ? ? ? ? ? ? ? ????2.為click綁定的函數(shù)添加return false
? ? ? ? 3.javaweb中Encoding的處理,structs的攔截器