代碼執行結果如下圖:
代碼說明
l Data類就是環境或者說上下文角色,持有對策略角色的引用。在這裡,我們通過一個方法來設置環境使用的策略,你也可以根據需求在構造方法中傳入具體策略對象。
l ShowDataStrategy抽象類就是抽象策略角色,它定義了策略共有的接口。
l ShowAllData、ShowPagedData以及SearchData類都是具體策略角色,它們實現真正的算法或行為。
l 客戶端在調用的時候才決定去使用哪種策略模式。
l 可以看到,由於顯示數據由各個具體策略類來實現,使得環境角色的復雜度降低了很多。並且如果以後還需要增加新的顯示數據方式的話只需要增加新的具體策略類(實現抽象策略接口)就可以了,環境類的代碼不需要做改動。對於各具體策略實現過程中可復用的部分也可以放在抽象策略類中實現。
何時采用
l 從代碼角度來說, 如果一個類有多種行為,並且在類內部通過條件語句來實現不同的行為的時候可以把這些行為單獨封裝為策略類。
l 從應用角度來說,如果系統需要選擇多種算法中的一種並且希望通過統一的接口來獲取算法的輸出的話可以考慮策略模式。
實現要點
l 在環境角色中擁有策略角色的實例。
l 如果策略角色需要使用環境中的數據,一般可以讓環境把數據傳給所有策略角色,或者可以讓環境把自身傳給策略角色,前者會帶來不必要的通訊開銷,後者會使環境和策略角色發生緊密耦合。根據需要選擇合適的方式。
l 環境角色可以在客戶端沒有提供策略角色的時候可以實現模式的策略。
注意事項
l 策略模式的缺點是客戶端需要了解具體的策略,因此僅當客戶端能做出這樣選擇的時候才去使用策略模式。
l 過多的策略對象可能會增加系統負擔,可以考慮把各種策略角色實現為無狀態對象的享元,需要保存的額外狀態由環境角色進行統一管理和處理。