策略模式(Strategy Pattern) 指對象有某個行為,但是在不同的場景中,該行為有不同的實現演算法。將每個演算法封裝在獨立的類中,使得它們可以互相替換。可以在運行時根據需要選擇不同的演算法,而不需要修改客戶端代碼。 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以 ...
策略模式(Strategy Pattern)
指對象有某個行為,但是在不同的場景中,該行為有不同的實現演算法。將每個演算法封裝在獨立的類中,使得它們可以互相替換。可以在運行時根據需要選擇不同的演算法,而不需要修改客戶端代碼。
主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。
關鍵代碼:實現同一個介面。
優點: 1、演算法可以自由切換。 2、避免使用多重條件判斷。 3、擴展性良好。
缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。 3、客戶端知道所有的演算法或行為的情況。
註意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。
組成:
1.抽象策略角色: 策略類,通常由一個介面或者抽象類實現。 2.具體策略角色:包裝了相關的演算法和行為。 3.環境角色:持有一個策略類的引用,最終給客戶端調用。環境類可以通過依賴註入、簡單工廠等方式來獲取具體策略對象。 ======================================================== 以上八股文 來源 網路拼湊 ====================================================================== 註 : 上述所謂的 演算法 不僅僅代表 冒泡排序,歸併排序,二分查找 等這種具體的演算法, 也代表 某些 業務邏輯,方法運行策略等(不要狹義的看問題) 舉個簡單小慄子: 當操作資料庫時(抽象策略角色), 用到了 增刪改查 (具體策略角色)四種 方式, 通過id 查詢 , 通過id 修改, 通過 id 刪除, 增加一個 id 數據 (維護當前使用 策略的對象【環境角色】)。/** * 操作資料庫時(抽象策略角色) */ public interface OperateStrategy { String operation(String id); } /** * insert操作 (具體策略角色) */ public class OperateInsert implements OperateStrategy{ @Override public String operation(String id) { return "insert into success !! id ==" + id ; } } /** * Select操作 */ public class OperateSelect implements OperateStrategy{ @Override public String operation(String id) { return "select success !! id ==" + id ; } } /** * Delete操作 */ public class OperateDelete implements OperateStrategy{ @Override public String operation(String id) { return "delete success !! id ==" + id ; } } /** * Update操作 */ public class OperateUpdate implements OperateStrategy{ @Override public String operation(String id) { return "update success !! id ==" + id ; } } /** * Context 執行上下文(環境角色) */ public class OperateContext { private OperateStrategy operateStrategy; public OperateContext(OperateStrategy operateStrategy){ this.operateStrategy = operateStrategy; } public String execute(String id){ return operateStrategy.operation(id); } } //執行 public static void main(String[] args) { OperateContext context = new OperateContext(new OperateSelect()); System.out.println(context.execute("select01")); context = new OperateContext(new OperateDelete()); System.out.println(context.execute("delete01")); context = new OperateContext(new OperateUpdate()); System.out.println(context.execute("update01")); context = new OperateContext(new OperateInsert()); System.out.println(context.execute("Insert01")); }
結果:
==========================================收工=================================================================================