首頁 > 軟體

Java利用策略模式實現條件判斷,告別if else

2022-02-24 16:00:18

定義

策略模式定義了一系列演演算法,並且將每個演演算法封裝起來,使得他們可以相互替換,而且演演算法的變化不會影響使用演演算法的使用者端。

使用場景

  • 一個系統需要動態的在幾種演演算法中選擇一種,可以把每個演演算法封裝到具體的策略類中
  • 一個類中定義了多種行為,可以去代替條件轉移語句,減少寫死
  • 系統中各個演演算法或者說函數是彼此獨立的,而且要求對客戶隱藏演演算法具體實現細節的時候
  • 多個類只區別在表現行為的不同,可以使用策略模式,在執行時動態的選擇要執行的行為

案例

需求

根據不同的水果口味,製作不同的蛋糕,比如現在有蘋果味和香蕉味的蛋糕,入參為蘋果味,則製作蘋果味蛋糕;入參為香蕉味,則製作香蕉味的蛋糕

實現方案

定義製作蛋糕的抽象類

/**
 * 蛋糕製作抽象類
 * @author:liyajie
 * @createTime:2022/2/24 10:53
 * @version:1.0
 */
public abstract class CakeHandler {
    /**
     * 製作蛋糕
     * @author: liyajie
     * @date: 2022/2/24 10:54
     * @param
     * @return void
     * @exception:
     * @update:
     * @updatePerson:
     **/
    public abstract void makeCake();
}

定義製作蘋果味蛋糕的策略類,繼承製作蛋糕抽象類,重寫makeCake方法

/**
 * 製作蘋果蛋糕策略
 * @author:liyajie
 * @createTime:2022/2/24 10:55
 * @version:1.0
 */
public class AppleCakeHandler extends CakeHandler{
    @Override
    public void makeCake() {
        System.out.println("正在製作蘋果蛋糕");
    }
}

定義製作香蕉味蛋糕的策略類,繼承製作蛋糕抽象類,重寫makeCake方法

/**
 * 製作香蕉蛋糕策略
 * @author:liyajie
 * @createTime:2022/2/24 10:55
 * @version:1.0
 */
public class BananaCakeHandler extends CakeHandler{
    @Override
    public void makeCake() {
        System.out.println("正在製作香蕉蛋糕");
    }
}

定義列舉類,來製作蛋糕的策略

/**
 * 製作蛋糕列舉
 * @author:liyajie
 * @createTime:2022/2/24 10:57
 * @version:1.0
 */
public enum CakeEnum {
    APPLE(AppleCakeHandler.class.getSimpleName(),new AppleCakeHandler()),
    BANANA(BananaCakeHandler.class.getSimpleName(),new BananaCakeHandler());

    private final String cakeType;
    private final CakeHandler cakeHandler;
    CakeEnum(String cakeType, CakeHandler cakeHandler){
        this.cakeType = cakeType;
        this.cakeHandler = cakeHandler;
    }

    // 匹配策略類
    public static CakeEnum match(String cakeType){
        CakeEnum[] values = CakeEnum.values();
        for (CakeEnum cakeEnum : values) {
            if(cakeType.equals(cakeEnum.cakeType)){
                return cakeEnum;
            }
        }
        return null;
    }

    public String getCakeType(){
        return cakeType;
    }

    public CakeHandler getCakeHandler(){
        return cakeHandler;
    }
}

定義測試類

/**
 * 測試類
 * @author:liyajie
 * @createTime:2022/2/24 11:07
 * @version:1.0
 */
public class Test {
    public static void main(String[] args) {
        String cakeType = AppleCakeHandler.class.getSimpleName();
        CakeEnum cakeEnum = CakeEnum.match(cakeType);
        CakeHandler cakeHandler = cakeEnum.getCakeHandler();
        cakeHandler.makeCake();

        cakeType = BananaCakeHandler.class.getSimpleName();
        cakeEnum = CakeEnum.match(cakeType);
        cakeHandler = cakeEnum.getCakeHandler();
        cakeHandler.makeCake();
    }
}

檢視測試結果

方案分析

通過該案例的實現,我們可以看到,使用策略模式+列舉,替換掉了if--else的寫死,並且把不同的策略封裝到了單獨的實現類中,防止一個策略出現問題後影響到其他的策略,提高了系統的可延伸性,最大程度上實現了開閉原則。

總結

優勢

  • 多重條件語句屬於寫死不易維護,而使用策略模式可以避免使用多重條件語句
  • 策略模式提供了一系列演演算法,恰當的使用繼承或者實現,可以把演演算法族裡面的公共程式碼提到父類別裡面。這樣就會避免重複的程式碼
  • 策略模式可以提供相同行為的不同實現,使用者端可以根據具體的業務邏輯去選擇合適的
  • 策略模式完美契合開閉原則,可以在不修改或者少修改原始碼的情況下,靈活增加、減少、修改新 演演算法
  • 策略模式把演演算法的使用放到環境類中,而演演算法的實現在具體策略類中,實現了二者的分離

劣勢

  • 在實際業務邏輯非常複雜的情況下,會導致出現很多策略類
  • 使用者端必須在恰當的時候,使用恰當的演演算法類,才能合理完成業務邏輯

到此這篇關於Java利用策略模式實現條件判斷,告別if else的文章就介紹到這了,更多相關Java策略模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com