何時采用
l 從代碼角度來說,如果一個邏輯的處理由不同責任對象完成,客戶端希望能自定義這個處理流程並且不希望直接和多個責任對象發生耦合的時候可以考慮責任鏈模式。
l 從應用角度來說,如果對一個事情的處理存在一個流程,需要經歷不同的責任點進行處理,並且這個流程比較復雜或只希望對外公開一個流程的入口點的話可以考慮責任鏈模式。其實,責任鏈模式還可以在構架的層次進行應用,比如.Net中的層次異常處理關系就可以看作是一種責任鏈模式。
實現要點
l 有一個抽象責任角色,避免各責任類型之間發生耦合。
l 抽象責任角色中定義了後繼責任角色,並對外提供一個方法供客戶端配置。
l 各具體責任類型根據待處理對象的狀態結合自己的責任范圍來判斷是否能處理對象,如果不能處理提交給上級責任人處理(也就是純的責任模式,要麼自己處理要麼提交給別人)。當然,也可以在進行部分處理後再提交給上級處理(也就是不純的責任鏈模式)。
l 需要在客戶端鏈接各個責任對象,如果鏈接的不恰當,可能會導致部分對象不能被任何一個責任對象進行處理。
注意事項
l 責任鏈模式和狀態模式的區別在於,前者注重責任的傳遞,並且責任鏈由客戶端進行配置,後者注重對象狀態的轉換,這個轉換過程對客戶端是透明的。