2017-01-24 60 views
1

我目前正在爲一個項目開發USB固件。在確定如何最好地處理來自主機的服務請求時,我決定實施責任鏈模式。當每個請求只有一個處理程序時,爲什麼責任鏈不適當?

在我的應用程序中,每個從主機檢索到的請求總是隻有一個處理程序。所以基本上我提前設置了處理程序鏈,並且循環從等待主機的請求開始。請求被傳遞給「根」處理程序,該處理程序通過檢查部分請求來決定是處理它還是將其傳遞給鏈。一旦處理完請求,我們就會循環等待來自主機的另一個請求。

同樣,只有一個處理程序會處理請求。請求未被處理,即遍歷整個處理程序鏈,是一個錯誤條件。

www.sourcemaking.com在責任鏈模式閱讀後,這句話引起了我的眼睛(在討論部分最後一段):

不要使用責任鏈時,每個請求僅由一個處理處理程序,或者當客戶端對象知道哪個服務對象應該處理請求時。

這是真的嗎?在我看來,在作者警告的情況下使用責任鏈是完全有效的。任何人都可以給我一些見解,說明爲什麼這是一個糟糕的設計選擇?

回答

2

我認爲你引用的警告措詞不好,可能會引起一些混淆。我認爲作者的意思是說:

當所有的請求只由一個處理程序處理,或者當客戶端對象知道哪個服務對象應該處理請求時,不要使用責任鏈。

另一種說法是,責任鏈模式引入了一些複雜性,如果實際上有多個處理程序,並且客戶機對象不太容易知道哪個處理程序使用。如果您知道只有一個處理程序,則不需要鏈或指針,因爲您確切知道要將該請求傳遞給哪個對象。如果您有多個處理程序,但很容易查看請求並使用簡單的「if」語句告訴哪個對象將處理它,那麼您又不需要鏈或指針。

另外:作爲一個在多個平臺上實現USB固件的人,我認爲你不需要像責任鏈這樣正式的東西。我也認爲你甚至不需要指針。您可以使用簡單的if語句和USB堆棧中的硬編碼回調函數將用戶代碼指向每個傳入控制轉移到可處理它的相應代碼。

+0

啊,是的,這是有道理的。 @DavidGrayson,「你可以使用簡單的if語句和USB堆棧中的硬編碼回調函數來將用戶代碼轉換爲可以處理它的適當代碼。」你能詳細說明你的意思嗎? – amandion

+1

你可以看看[這個USB協議棧](https://github.com/pololu/wixel-sdk/blob/master/libraries/src/usb/usb.c),看看如何開始一個新的控制傳輸,它根據控制傳輸中的值調用usbStandardDeviceRequestHandler或usbCallbackSetupHandler。後者的功能必須在使用USB堆棧的任何應用程序中定義。 –

+0

感謝您的鏈接!我已經看到了我們使用的平臺的製造商的類似例子。但是,我有要求運行時如何/何時處理請求的要求。這是我參加W/CoR的原因之一。再次感謝您的輸入! – amandion

相關問題