1. 基本概念
責(zé)任鏈模式(Chain of Responsibility Pattern)為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈谅摄。實(shí)現(xiàn)了發(fā)送者和接收者之間的解耦聪廉,屬于行為型模式萧诫。
2 主要思想
各司其職扮饶,職責(zé)鏈上的處理者負(fù)責(zé)處理請(qǐng)求夺巩,客戶端只需要將請(qǐng)求發(fā)送到職責(zé)鏈上贞让,不用關(guān)心接下來的請(qǐng)求傳遞及請(qǐng)求處理。
主要的實(shí)現(xiàn)方式是攔截類都實(shí)現(xiàn)統(tǒng)一的接口柳譬,方便統(tǒng)一傳遞喳张。
在處理類Handler中聚合自己,在過濾接口美澳,例如HandlerRequest 中判斷是否應(yīng)該由自己處理销部,如果不是,繼續(xù)傳遞給上層處理制跟。
3. 代碼實(shí)現(xiàn)
需求:職員Staff 想要請(qǐng)假8天舅桩,逐級(jí)向上審批,經(jīng)理可以審批3天內(nèi)的雨膨,總監(jiān)可以審批7天內(nèi)的擂涛,老板可以審批7天以上的。
public static void main(String[] args) {
String msg = "家里有事聊记,請(qǐng)假8天撒妈,望批準(zhǔn)!";
Staff staff = new Staff();
Manager manager = new Manager();
Director director = new Director();
Boss boss = new Boss();
staff.setProcessor(manager);
manager.setProcessor(director);
director.setProcessor(boss);
staff.handler(msg);
}
}
abstract class Handler {
Handler processor;
abstract void handler(String msg);
abstract void setProcessor(Handler processor);
abstract Handler getProcessor();
}
class Staff extends Handler {
private Handler processor;
@Override
void handler(String msg) {
System.out.println("小弟不能自己做主,只能向上申請(qǐng)!");
this.processor.handler(msg);
}
@Override
void setProcessor(Handler processor) {
this.processor = processor;
}
@Override
Handler getProcessor() {
return processor;
}
}
class Manager extends Handler {
private Handler processor;
@Override
void handler(String msg) {
System.out.println("我只能審批3天內(nèi)的排监,超出3天的范圍踩身,需Director審批!");
this.processor.handler(msg);
}
@Override
void setProcessor(Handler processor) {
this.processor = processor;
}
@Override
Handler getProcessor() {
return processor;
}
}
class Director extends Handler {
private Handler processor;
@Override
void handler(String msg) {
System.out.println("我只能審批7天內(nèi)的,超出7天的范圍社露,挟阻,需Boss審批!");
this.processor.handler(msg);
}
@Override
void setProcessor(Handler processor) {
this.processor = processor;
}
@Override
Handler getProcessor() {
return processor;
}
}
class Boss extends Handler {
private Handler processor;
@Override
void handler(String msg) {
System.out.println("批準(zhǔn)!");
}
@Override
void setProcessor(Handler processor) {
this.processor = processor;
}
@Override
Handler getProcessor() {
return processor;
}
運(yùn)行結(jié)果
小弟不能自己做主,只能向上申請(qǐng)!
我只能審批3天內(nèi)的,超出3天的范圍附鸽,需Director審批!
我只能審批7天內(nèi)的脱拼,超出7天的范圍,坷备,需Boss審批!
批準(zhǔn)!
4. 優(yōu)劣之分
優(yōu)點(diǎn):
1熄浓、降低耦合度。它將請(qǐng)求的發(fā)送者和接收者解耦省撑。
2赌蔑、簡(jiǎn)化了對(duì)象。使得對(duì)象不需要知道鏈的結(jié)構(gòu)竟秫。
3娃惯、增強(qiáng)給對(duì)象指派職責(zé)的靈活性。通過改變鏈內(nèi)的成員或者調(diào)動(dòng)它們的次序肥败,允許動(dòng)態(tài)地新增或者刪除責(zé)任趾浅。
4、增加新的請(qǐng)求處理類很方便馒稍。
缺點(diǎn):
1皿哨、不能保證請(qǐng)求一定被接收。
2纽谒、系統(tǒng)性能將受到一定影響证膨,而且在進(jìn)行代碼調(diào)試時(shí)不太方便,可能會(huì)造成循環(huán)調(diào)用鼓黔。
3椎例、可能不容易觀察運(yùn)行時(shí)的特征,有礙于除錯(cuò)请祖。
使用場(chǎng)景:
1订歪、有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定肆捕。
2刷晋、在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求慎陵。
3眼虱、可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。