責(zé)任鏈模式
介紹
對(duì)于鏈?zhǔn)浇Y(jié)構(gòu),將每一個(gè)節(jié)點(diǎn)看做一個(gè)對(duì)象,每一個(gè)對(duì)象擁有不同的處理邏輯,將一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出,沿著鏈的路徑一次傳遞給一個(gè)節(jié)點(diǎn)對(duì)象,直至有對(duì)象處理這個(gè)請(qǐng)求為止,我們將這樣一種模式成為責(zé)任鏈模式。
定義
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免了發(fā)送者和接受者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞改請(qǐng)求,直到有對(duì)象處理它為止。
使用場(chǎng)景
- 多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,但具體由哪個(gè)對(duì)象處理則在運(yùn)行時(shí)動(dòng)態(tài)決定。
- 在請(qǐng)求處理者不明確的情況下向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求
- 需要?jiǎng)討B(tài)指定一組對(duì)象處理請(qǐng)求
基本程序
- 抽象處理類
public abstract class Handler {
protected Handler nextHandler;//下一節(jié)點(diǎn)處理者
public abstract void handle(String condition);//處理函數(shù)
}
- 具體處理者1
public class FirstHandler extends Handler {
@Override
public void handle(String condition) {
if (condition.equals("FirstHandler")) {
handle(condition);
} else {
nextHandler.handle(condition);
}
}
}
- 具體處理者2
public class SecondHandler extends Handler {
@Override
public void handle(String condition) {
if (condition.equals("SecondHandler")) {
handle(condition);
} else {
nextHandler.handle(condition);
}
}
}
-
客戶類
public class Client { public static void main(String[] args) { FirstHandler firstHandler = new FirstHandler(); SecondHandler secondHandler = new SecondHandler(); firstHandler.nextHandler = secondHandler; secondHandler.nextHandler = firstHandler; firstHandler.handle("SecondHandler"); } }
角色介紹:
- Handler :抽象處理者角色,聲明一個(gè)請(qǐng)求處理的方法,并在其中保持一個(gè)對(duì)下一個(gè)處理節(jié)點(diǎn)的 Handler 對(duì)象的引用。
- FirstHandler , SecondHandler : 具體處理者角色,對(duì)請(qǐng)求進(jìn)行處理,如果不能處理則將請(qǐng)求轉(zhuǎn)發(fā)給下一個(gè)節(jié)點(diǎn)處理。
Android 中應(yīng)用
類似于 Android 中事件的分發(fā)處理, 有序廣播。
總結(jié)
- 優(yōu)點(diǎn): 對(duì)請(qǐng)求者和處理者關(guān)系解耦,提高代碼靈活性,
- 缺點(diǎn):對(duì)請(qǐng)求處理者進(jìn)行遍歷影響性能。