我目前正在爲一個項目開發USB固件。在確定如何最好地處理來自主機的服務請求時,我決定實施責任鏈模式。當每個請求只有一個處理程序時,爲什麼責任鏈不適當?
在我的應用程序中,每個從主機檢索到的請求總是隻有一個處理程序。所以基本上我提前設置了處理程序鏈,並且循環從等待主機的請求開始。請求被傳遞給「根」處理程序,該處理程序通過檢查部分請求來決定是處理它還是將其傳遞給鏈。一旦處理完請求,我們就會循環等待來自主機的另一個請求。
同樣,只有一個處理程序會處理請求。請求未被處理,即遍歷整個處理程序鏈,是一個錯誤條件。
從www.sourcemaking.com在責任鏈模式閱讀後,這句話引起了我的眼睛(在討論部分最後一段):
不要使用責任鏈時,每個請求僅由一個處理處理程序,或者當客戶端對象知道哪個服務對象應該處理請求時。
這是真的嗎?在我看來,在作者警告的情況下使用責任鏈是完全有效的。任何人都可以給我一些見解,說明爲什麼這是一個糟糕的設計選擇?
啊,是的,這是有道理的。 @DavidGrayson,「你可以使用簡單的if語句和USB堆棧中的硬編碼回調函數來將用戶代碼轉換爲可以處理它的適當代碼。」你能詳細說明你的意思嗎? – amandion
你可以看看[這個USB協議棧](https://github.com/pololu/wixel-sdk/blob/master/libraries/src/usb/usb.c),看看如何開始一個新的控制傳輸,它根據控制傳輸中的值調用usbStandardDeviceRequestHandler或usbCallbackSetupHandler。後者的功能必須在使用USB堆棧的任何應用程序中定義。 –
感謝您的鏈接!我已經看到了我們使用的平臺的製造商的類似例子。但是,我有要求運行時如何/何時處理請求的要求。這是我參加W/CoR的原因之一。再次感謝您的輸入! – amandion