這篇主要是在看Tomcat源碼的時(shí)候撬统,遇到了責(zé)任鏈模式相關(guān)的東西腾供,做一下簡(jiǎn)單記錄岖沛,可以和Tomcat源碼中責(zé)任鏈的應(yīng)用對(duì)比學(xué)習(xí)下罢坝,會(huì)更有效果廓握。
責(zé)任鏈模式的定義
責(zé)任鏈模式(Chain of Responsibility)是一種對(duì)象的行為模式。在責(zé)任鏈模式里嘁酿,很多對(duì)象由每一個(gè)對(duì)象對(duì)其下家的引用而連接起來(lái)形成一條鏈疾棵。請(qǐng)求在這個(gè)鏈上傳遞,直到鏈上的某一個(gè)對(duì)象決定處理此請(qǐng)求痹仙。發(fā)出這個(gè)請(qǐng)求的客戶端并不知道鏈上的哪一個(gè)對(duì)象最終處理這個(gè)請(qǐng)求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任殉了。
《JAVA與模式》-閻宏
責(zé)任鏈模式的結(jié)構(gòu)
責(zé)任鏈模式總共存在兩個(gè)角色开仰,抽象處理者(Handler)和具體處理者(ConcreteHandler)。
抽象處理者,定義處理請(qǐng)求的接口众弓,通常也會(huì)有包含下一個(gè)和上一個(gè)處理者的方法恩溅,抽象處理者一般是一個(gè)接口或者抽象類。
具體處理者谓娃,是對(duì)抽象處理者的實(shí)現(xiàn)脚乡,不同的實(shí)現(xiàn)。當(dāng)前如果能處理請(qǐng)求滨达,就處理奶稠,如果不能處理請(qǐng)求就交給下家處理。
責(zé)任鏈模式的舉例
Handler:
package me.cxis.test.gof.chainofresponsibility;
/**
* Created by cheng.xi on 2017-05-05 17:46.
*/
public abstract class Handler {
protected Handler successor;
public abstract void handleRequest(String condition);
public Handler getSuccessor() {
return successor;
}
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
ConcreteHandler1:
package me.cxis.test.gof.chainofresponsibility;
/**
* Created by cheng.xi on 2017-05-05 17:49.
*/
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String condition) {
if(condition.equals("1")){
System.out.println("ConcreteHandler1處理");
return;
}else {
System.out.println("ConcreteHandler1不處理捡遍,由其他的Handler處理");
getSuccessor().handleRequest(condition);
}
}
}
ConcreteHandler2:
package me.cxis.test.gof.chainofresponsibility;
/**
* Created by cheng.xi on 2017-05-05 17:49.
*/
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String condition) {
if(condition.equals("2")){
System.out.println("ConcreteHandler2處理");
return;
}else {
System.out.println("ConcreteHandler2不處理锌订,由其他的Handler處理");
getSuccessor().handleRequest(condition);
}
}
}
ConcreteHandlerX:
package me.cxis.test.gof.chainofresponsibility;
/**
* Created by cheng.xi on 2017-05-05 17:49.
*/
public class ConcreteHandlerX extends Handler {
@Override
public void handleRequest(String condition) {
//一般是最后一個(gè)處理者
System.out.println("ConcreteHandlerX處理");
}
}
Client:
package me.cxis.test.gof.chainofresponsibility;
/**
* Created by cheng.xi on 2017-05-05 17:53.
*/
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handlerX = new ConcreteHandlerX();
handler1.setSuccessor(handler2);
handler2.setSuccessor(handlerX);
handler1.handleRequest("2");
}
}
責(zé)任鏈模式的優(yōu)點(diǎn)
當(dāng)然上面的例子我們可以直接在Client中寫if-else
,不過(guò)這樣耦合度就太高了画株,而且如果順序發(fā)生變化會(huì)很難弄辆飘,而責(zé)任鏈模式可以解耦,將發(fā)送者和接受者分開谓传。
責(zé)任鏈模式的缺點(diǎn)
責(zé)任鏈可能很長(zhǎng)蜈项,即便某一個(gè)點(diǎn)不處理請(qǐng)求,也需要經(jīng)過(guò)這個(gè)點(diǎn)续挟,這樣會(huì)有性能問題紧卒。
責(zé)任鏈模式的應(yīng)用場(chǎng)景
- Servlet中的過(guò)濾器
- Tomcat中的Filter
- Tomcat中容器的設(shè)置