責任鏈模式里面的很多對象對其下家的引用而形成一條連鎖雨饺,請求在這個鏈條上傳遞,直到被處理完畢僧免,而客戶端并不知道鏈條上哪個鏈接點處理了這個事件。開發(fā) Web 項目的時候怀大,過濾器就是這樣工作的塘秦,過濾器互相嵌套,一個接著一個處理請求移斩。這個好處就是在客戶端不在意的情況下動態(tài)處理連接點以及分配任務。
按照慣例,先上 UML 類圖
- Handler :抽象處理角色轿腺,定義一個處理請求的接口,可以設定返回下家的引用丛楚;
- ConcreteHandler:具體處理角色族壳,接收到請求的具體處理者,可以選擇處理也可以不處理趣些,把請求傳遞下一個連接點仿荆。
看下具體的代碼:
先把抽象處理者寫出來,他是一個抽象類或者接口,這里使用抽象類坏平,每個處理者給一個名字 name 屬性
public abstract class Handler {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Handler(String name) {
this.name=name;
}
protected Handler handler;
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
public abstract void handle();
}
再把具體的處理者實現(xiàn)出來
public class ConcreteHandler extends Handler{
public ConcreteHandler(String name) {
super(name);
}
@Override
public void handle() {
System.out.println("當前處理:"+getName());
if(getHandler()!=null){
getHandler().handle();
}
}
}
在該具體方法的 handle 里面拢操,處理自個當前需要做的事件,然后尋找后續(xù)處理者舶替,把到最后完成令境。
看下客戶端如何處理
public class Client {
public static void main(String[] args) {
Handler h1=new ConcreteHandler("handler1");
Handler h2=new ConcreteHandler("handler2");
h1.setHandler(h2);
h1.handle();
}
}
在責任鏈模式當中,對處理者而言坎穿,一旦一個請求只有一個處理者處理了展父,稱之為純的責任鏈模式,然并卵玲昧,現(xiàn)實沒有這么純的責任鏈栖茉;那么不純的就是一個請求被0個或多個處理者處理了,這個情況很常見孵延。責任鏈使得客戶端請求與接收端處理減低耦合度吕漂,使得多個處理者都可以處理這個請求。這個鏈可以是一棵樹尘应,也可以是鏈表惶凝,也可以是個環(huán)吼虎。但是每個處理者只可以傳遞任務給下一個處理者,或者自己處理掉苍鲜,不可能同時傳遞多個思灰。