目錄
定義
責(zé)任鏈模式(Chain of Responsibility)是一種對象的行為模式。在責(zé)任鏈模式里渺绒,很多對象由每一個(gè)對象對其下家的引用而連接起來形成一條鏈。請求在這個(gè)鏈上傳遞磷瘤,直到鏈上的某一個(gè)對象決定處理此請求芒篷。發(fā)出這個(gè)請求的客戶端并不知道鏈上的哪一個(gè)對象最終處理這個(gè)請求,這使得系統(tǒng)可以在不影響客戶端的情況下動(dòng)態(tài)地重新組織和分配責(zé)任采缚。
責(zé)任鏈的定義有些抽象针炉,其實(shí)就是使多個(gè)對象都有機(jī)會(huì)處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關(guān)系扳抽,將這些對象形成一條鏈篡帕,并沿著這條鏈傳遞該請求,直到有對象處理它為止贸呢。就像我們上學(xué)時(shí)在班級上傳遞小紙條一樣镰烧,一個(gè)同學(xué)傳遞給另一個(gè)同學(xué),如果是傳給該同學(xué)的那么該同學(xué)接受楞陷,傳遞終止怔鳖,否則傳遞給下一個(gè)同學(xué)。在這其中一個(gè)一個(gè)的同學(xué)組成一條鏈固蛾,在這條鏈上的每個(gè)同學(xué)都有可能接收紙條(處理請求)结执,如果一個(gè)同學(xué)要傳遞給下一個(gè)同學(xué)就要知道同學(xué)的名字(引用)。
使用場景
- 多個(gè)對象能夠處理同一請求艾凯,具體處理則在運(yùn)行時(shí)動(dòng)態(tài)確定
- 在請求矗立著不明確的時(shí)候向多個(gè)對象提交同一個(gè)請求
- 需要?jiǎng)討B(tài)制定一組對象處理請求
代碼運(yùn)用
- 抽象處理者(Handler)角色:定義出一個(gè)處理請求的接口献幔。可以定義 出一個(gè)方法以設(shè)定和返回對下家的引用趾诗。這個(gè)角色通常由一個(gè)Java抽象類或者Java接口實(shí)現(xiàn)蜡感。
public abstract class Handler {
public Handler nextHandler;
public void handleRequest(Request request){
if(getHandleLevel()==request.getRequestLevel())
{
handle(request);
}else {
if(nextHandler!=null)
{
nextHandler.handleRequest(request);
}else {
System.out.println("----> 所有的處理對象都不能處理它");
}
}
}
/**
* 每個(gè)處理者的對象的具體處理方式
* @param Request
*/
public abstract void handle(Request request);
/**
* 每個(gè)處著對象處理的級別
* @return
*/
public abstract int getHandleLevel();
}
//請求的抽象封裝類
public abstract class Request {
private Object object;
public Request(Object object){
this.object=object;
}
/**
* 具體的內(nèi)容對象
* @return
*/
public Object getContent(){
return object;
}
/**
* 獲取請求級別
*/
public abstract int getRequestLevel();
}
- 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉恃泪,或者將請求傳給下一個(gè)對象郑兴。由于具體處理者持有對下一個(gè)對象的引用,因此悟泵,如果需要杈笔,具體處理者可以訪問下一個(gè)對象。
public class ConcreteHandler extends Handler{
@Override
public void handle(Request request) {
System.out.println("----handle1 處理請求: "+request.getRequestLevel());
}
@Override
public int getHandleLevel() {
return 1;
}
}
-
發(fā)送者發(fā)送請求
public class Client { public static void main(String[] args) { //確定鏈?zhǔn)疥P(guān)系 Handler handler1=new ConcreteHandler1(); Handler handler2=new ConcreteHandler2(); Handler handler3=new ConcreteHandler3(); handler1.nextHandler=handler2; handler2.nextHandler=handler3; //建立請求 Request request=new Request("請求1"); handler1.handleRequest(request); } }
首先由handler1處理請求糕非,如果請求不是給它的蒙具,就會(huì)傳遞下一個(gè)(handler2)因?yàn)閔andler1有handler2的引用( handler1.nextHandler=handler2)。