定義
責(zé)任鏈模式(Chain of Responsibility) 使多個對象都有機(jī)會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象能夠處理它。
模式結(jié)構(gòu)
角色職責(zé)
-
抽象處理類: 主要包含一個指向下一處理類的成員變量 nextHandler 和一個處理請求的方法 handRequest,handRequest 方法的主要思想是,如果滿足處理的條件,則有本處理類來進(jìn)行處理,否則由 nextHandler 來處理。
-
具體處理類: 具體處理類的主要是對具體的處理邏輯和處理的適用條件進(jìn)行實(shí)現(xiàn)。
-
客戶類(Client)角色: 創(chuàng)建處理鏈,并向鏈頭的具體處理者對象提交請求,它不關(guān)心處理細(xì)節(jié)和請求的傳遞過程。
代碼實(shí)現(xiàn)
抽象處理類:
abstract class Handler {
private Handler next;
public Handler getNext() {
return next;
}
public void setNext(Handler next) {
this.next = next;
}
public abstract void handleRequest(String request);
}
具體處理類:
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String request) {
if ("one".equals(request)) {
System.out.println("具體處理者1負(fù)責(zé)處理該請求!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("沒有人處理該請求!");
}
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String request) {
if (request.equals("two")) {
System.out.println("具體處理者2負(fù)責(zé)處理該請求!");
} else {
if (getNext() != null) {
getNext().handleRequest(request);
} else {
System.out.println("沒有人處理該請求!");
}
}
}
}
客戶端請求:
public class ChainOfResponsibilityPattern {
public static void main(String[] args) {
//組裝責(zé)任鏈
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
//提交請求
handler1.handleRequest("two");
}
}
輸出結(jié)果:
具體處理者2負(fù)責(zé)處理該請求!
適用場景
1.有多個對象可以處理一個請求,哪個對象處理該請求由運(yùn)行時刻自動確定。
2.可動態(tài)指定一組對象處理請求,或添加新的處理者。
3.在不明確指定請求處理者的情況下,向多個處理者中的一個提交請求。文章來源:http://www.zghlxwxcb.cn/news/detail-474237.html
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.實(shí)現(xiàn)了請求發(fā)送者與請求處理者之間的松耦合
2.可動態(tài)添加責(zé)任對象、刪除責(zé)任對象、改變責(zé)任對象順序,非常靈活
3.每個責(zé)任對象專注于做自己的事情,職責(zé)明確
缺點(diǎn):
1.不能保證每個請求一定被處理。由于一個請求沒有明確的接收者,所以不能保證它一定會被處理,該請求可能一直傳到鏈的末端都得不到處理。
2.對比較長的職責(zé)鏈,請求的處理可能涉及多個處理對象,系統(tǒng)性能將受到一定影響。
3.職責(zé)鏈建立的合理性要靠客戶端來保證,增加了客戶端的復(fù)雜性,可能會由于職責(zé)鏈的錯誤設(shè)置而導(dǎo)致系統(tǒng)出錯,如可能會造成循環(huán)調(diào)用。文章來源地址http://www.zghlxwxcb.cn/news/detail-474237.html
到了這里,關(guān)于java設(shè)計(jì)模式(十五)責(zé)任鏈模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!