1.責任鏈模式概念
在《Head First Design Patterns》文中是這么介紹責任鏈模式的,“通過責任鏈模式,你可以為某個請求創建一個對象鏈。每個對象依次檢查此請求,并對其進行處理,或者將它傳給鏈中的下一個對象”,這句話已經很好了解了。責任鏈模式屬于行為型模式。
在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。
2.責任鏈模式的作用
避免請求發送者與接收者耦合在一起,讓多個對象都有可能接收請求,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求,直到有對象處理它為止。
職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了。
3.使用場景
1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。
2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。
3、可動態指定一組對象處理請求。
4.優點和缺點
優點
1、降低耦合度。它將請求的發送者和接收者解耦。
2、簡化了對象。使得對象不需要知道鏈的結構。
3、增強給對象指派職責的靈活性。通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者刪除責任。
4、增加新的請求處理類很方便。
缺點
1、不能保證請求一定被接收。
2、系統性能將受到一定影響,而且在進行代碼調試時不太方便,可能會造成循環調用。
3、可能不容易觀察運行時的特征,有礙于除錯。
5.例子解析
這個例子是《Head First Design Patterns》上的,這里的例子需要說明的是客戶端發送給責任鏈上的請求,責任鏈上的對象將不會對請求進行攔截,處理了消息后并繼續將請求傳遞給下一個對象。當然你也可以選擇當有對象處理請求后,就停止傳遞請求。
責任鏈上的對象同意繼承這個類LHanlder,這個可以是接口也可以是抽象對象。
public abstract class LHanlder {
private LHanlder next;
private boolean successor;
public void setNextTor(LHanlder next)
{
this.next = next;
}
public boolean isSuccessor() {
return successor;
}
public void setSuccessor(boolean successor) {
this.successor = successor;
}
public void handlerRequest(String msg) {
if (successor) {
print(msg);
}
if (next!=null) {
next.handlerRequest(msg);
}
}
public abstract void print(String msg);
}
責任鏈上的對象:FanHandler
public class FanHandler extends LHanlder {
@Override
public void print(String msg) {
System.out.println("FanHandler處理:"+msg);
}
}
責任鏈上的對象:SpamHandler
public class SpamHandler extends LHanlder {
@Override
public void print(String msg) {
System.out.println("SpamHandler處理:"+msg);
}
}
責任鏈上的對象:NewLocHandler
public class NewLocHandler extends LHanlder {
@Override
public void print(String msg) {
System.out.println("NewLocHandler處理:"+msg);
}
}
責任鏈上的對象:ComplainHandler
public class ComplainHandler extends LHanlder {
@Override
public void print(String msg) {
System.out.println("ComplainHandler處理:"+msg);
}
}
客戶端:
public class Client {
public static void main(String[] args) {
String msg ="郵件到!";
LHanlder spam = new SpamHandler();
LHanlder fan = new FanHandler();
LHanlder complain = new ComplainHandler();
LHanlder newLoc = new NewLocHandler();
spam.setNextTor(fan);
fan.setNextTor(complain);
complain.setNextTor(newLoc);
spam.setSuccessor(true);
fan.setSuccessor(true);
complain.setSuccessor(true);
newLoc.setSuccessor(true);
spam.handlerRequest(msg);
spam.setSuccessor(true);
fan.setSuccessor(true);
complain.setSuccessor(false);
newLoc.setSuccessor(true);
spam.handlerRequest(msg);
}
}
//輸出結果:
//SpamHandler處理:郵件到!
//FanHandler處理:郵件到!
//ComplainHandler處理:郵件到!
//NewLocHandler處理:郵件到!
//SpamHandler處理:郵件到!
//FanHandler處理:郵件到!
//NewLocHandler處理:郵件到!
6.總結
責任鏈模式比較簡單,可以查看參考文章里的例子,可以加深了解。
7.參考文章
http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
8.源碼地址
http://download.csdn.net/download/lgywsdy/10026552