責任連模式

2021-09-14 07:38:21 字數 2457 閱讀 4078

定義:使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條

鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。

型別:行為類模式

類圖:

1.14 command-pattern

首先來看一段**:

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

}

**的業務邏輯是這樣的,方法有兩個引數:整數i和乙個請求request,根據i的值來決定由誰來處理reques

t,如果i1,由handler1來處理,如果i2,由handler2來處理,以此類推。在程式設計中,這種處理業務的方法

第 1 章 23 種設計模式 | 42

非常常見,所有處理請求的類有if…else…條件判斷語句連成一條責任鏈來對請求進行處理,相信大家都經常用

到。這種方法的優點是非常直觀,簡單明瞭,並且比較容易維護,但是這種方法也存在著幾個比較令人頭疼的問

題:• **臃腫:實際應用中的判定條件通常不是這麼簡單地判斷是否為1或者是否為2,也許需要複雜的計算,也

許需要查詢資料庫等等,這就會有很多額外的**,如果判斷條件再比較多,那麼這個if…else…語句基本上

就沒法看了。

• 耦合度高:如果我們想繼續新增處理請求的類,那麼就要繼續新增else if判定條件;另外,這個條件判定的

順序也是寫死的,如果想改變順序,那麼也只能修改這個條件語句。

既然缺點我們已經清楚了,就要想辦法來解決。這個場景的業務邏輯很簡單:如果滿足條件1,則由handler1來

處理,不滿足則向下傳遞;如果滿足條件2,則由handler2來處理,不滿足則繼續向下傳遞,以此類推,直到條

件結束。其實改進的方法也很簡單,就是把判定條件的部分放到處理類中,這就是責任連模式的原理。

責任連模式的結構

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

• 抽象處理類:抽象處理類中主要包含乙個指向下一處理類的成員變數nexthandler和乙個處理請求的方法ha

ndrequest,handrequest方法的主要主要思想是,如果滿足處理的條件,則有本處理類來進行處理,否

則由nexthandler來處理。

• 具體處理類:具體處理類主要是對具體的處理邏輯和處理的適用條件進行實現。

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

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…語句的缺點是一樣的,那就是在找到正確

的處理類之前,所有的判定條件都要被執行一遍,當責任鏈比較長時,效能問題比較嚴重。

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

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

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

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

責任鏈模式

責任鏈模式 chain of responsibility 的目標是使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理它為止。舉個例子。你到銀行去辦理業務,只是簡單的存個錢,也許atm就解決你的問題。如果你是為了交費...