java 策略模式

zy平平仄仄發表於2024-04-14

策略模式(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"));

    }

結果:

==========================================收工=================================================================================

    
  

相關文章