責(zé)任鏈模式:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞該請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。
適用性:
  • 有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,哪個(gè)對(duì)象處理該請(qǐng)求運(yùn)行時(shí)刻自動(dòng)確定。
  • 你想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。
  • 可處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)被動(dòng)態(tài)指定。

涉及的角色:
抽象處理者(Handler)角色:定義出一個(gè)處理請(qǐng)求的接口,如果需要可以定義出一些方法,與設(shè)定與返回對(duì)下家的引用。
具體處理者(ConcreteHandler)角色:具體處理者接收到請(qǐng)求后,可以選擇將請(qǐng)求處理掉,或者將請(qǐng)求傳給下家。
未命名44.bmp

一個(gè)簡(jiǎn)單的例子:
抽象處理者:

package?cor;
public?abstract?class?Handler{
????
private?Handler?successor;
????
//調(diào)用此方法處理請(qǐng)求
????public?abstract?void?handleRequest();
????
//設(shè)置下家
????public?void?setSuccessor(Handler?successor){
????????
this.successor=successor;
????}

????
//返回下家的引用
????public?Handler?getSuccessor(){
????????
return?this.successor;
????}

????
}

具體處理者:

package?cor;

public?class?ConcreteHandler?extends?Handler{
????
//處理請(qǐng)求
????public?void?handleRequest(){
????????
//給下家處理
????????if(getSuccessor()!=null)
????????????
{
????????????????System.out.println(
"the?request?is?passed?to"+getSuccessor());
????????????????getSuccessor().handleRequest();
????????????}

????????????
else{
????????????????
//自己處理
????????????????System.out.println("the?request?is?handled?here");
????????????}

????}

}

客戶端:
package?cor;
public?class?Client{
????
public?static?void?main(String[]?args){
????????Handler?handler1
=new?ConcreteHandler();
????????Handler?handler2
=new?ConcreteHandler();
????????handler1.setSuccessor(handler2);
????????handler1.handleRequest();
????}

}


參考資料:《Java與模式》
《設(shè)計(jì)模式速查手冊(cè)》