23種設計模式(11) 責任連模式

2021-06-06 11:47:29 字數 2304 閱讀 1545

定義:使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。

型別:行為類模式

類圖:

首先來看一段**:

public void test(int i, request request)else if(i == 2)else if(i == 3)else if(i == 4)else

}

**的業務邏輯是這樣的,方法有兩個引數:整數i和乙個請求request,根據i的值來決定由誰來處理request,如果i==1,由handler1來處理,如果i==2,由handler2來處理,以此類推。在程式設計中,這種處理業務的方法非常常見,所有處理請求的類有if…else…條件判斷語句連成一條責任鏈來對請求進行處理,相信大家都經常用到。這種方法的優點是非常直觀,簡單明瞭,並且比較容易維護,但是這種方法也存在著幾個比較令人頭疼的問題:

既然缺點我們已經清楚了,就要想辦法來解決。這個場景的業務邏輯很簡單:如果滿足條件1,則由handler1來處理,不滿足則向下傳遞;如果滿足條件2,則由handler2來處理,不滿足則繼續向下傳遞,以此類推,直到條件結束。其實改進的方法也很簡單,就是把判定條件的部分放到處理類中,這就是責任連模式的原理。

責任連模式的結構

責任連模式的類圖非常簡單,它由乙個抽象地處理類和它的一組實現類組成:

了解了責任連模式的大體思想之後,再看**就比較好理解了:

class level ;

public boolean above(level level)

return false; }}

class request

public level getlevel()

}class response

abstract class handler elseelse

} return response;

} public void setnexthandler(handler handler)

protected abstract level gethandlerlevel();

public abstract response response(request request);

}class concretehandler1 extends handler

public response response(request request)

}class concretehandler2 extends handler

public response response(request request)

}class concretehandler3 extends handler

public response response(request request)

}public class client

}

**中level類是模擬判定條件;request,response分別對應請求和響應;抽象類handler中主要進行條件的判斷,這裡模擬乙個處理等級,只有處理類的處理等級高於request的等級才能處理,否則交給下乙個處理者處理。在client類中設定好鏈的前後執行關係,執行時將請求交給第乙個處理類,這就是責任連模式,它完成的功能與前文中的if…else…語句是一樣的。

責任鏈模式的優缺點

責任鏈模式與if…else…相比,他的耦合性要低一些,因為它把條件判定都分散到了各個處理類中,並且這些處理類的優先處理順序可以隨意設定。責任鏈模式也有缺點,這與if…else…語句的缺點是一樣的,那就是在找到正確的處理類之前,所有的判定條件都要被執行一遍,當責任鏈比較長時,效能問題比較嚴重。

責任鏈模式的適用場景

就像開始的例子那樣,假如使用if…else…語句來組織乙個責任鏈時感到力不從心,**看上去很糟糕時,就可以使用責任鏈模式來進行重構。

總結

責任鏈模式其實就是乙個靈活版的if…else…語句,它就是將這些判定條件的語句放到了各個處理類中,這樣做的優點是比較靈活了,但同樣也帶來了風險,比如設定處理類前後關係時,一定要特別仔細,搞對處理類前後邏輯的條件判斷關係,並且注意不要在鏈中出現迴圈引用的問題。

23種設計模式(11) 責任連模式

定義 使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。型別 行為類模式 類圖 首先來看一段 public void test int i,request request else if i 2 else i...

23種設計模式之責任鏈模式

責任鏈模式 chain of responsibility pattern 為請求建立了乙個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式。在這種模式中,通常每個接收者都包含對另乙個接收者的引用。如果乙個物件不能處理該請求,那麼它會把相同的請...

23種設計模式 13 責任鏈模式

使多個物件都有機會處理請求,從而避免請求的傳送者和接受者質檢的耦合關係。將這個接收物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理他為止。先來看乙個反面例子 使用大量的if判斷來選擇執行邏輯 public response handlerequest request request else...