溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java中怎么用策略模式實現(xiàn)條件判斷

發(fā)布時間:2022-02-24 16:38:32 來源:億速云 閱讀:248 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細介紹“Java中怎么用策略模式實現(xiàn)條件判斷”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“Java中怎么用策略模式實現(xiàn)條件判斷”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

定義

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

使用場景

  • 一個系統(tǒng)需要動態(tài)的在幾種算法中選擇一種,可以把每個算法封裝到具體的策略類中

  • 一個類中定義了多種行為,可以去代替條件轉(zhuǎn)移語句,減少硬編碼

  • 系統(tǒng)中各個算法或者說函數(shù)是彼此獨立的,而且要求對客戶隱藏算法具體實現(xiàn)細節(jié)的時候

  • 多個類只區(qū)別在表現(xiàn)行為的不同,可以使用策略模式,在運行時動態(tài)的選擇要執(zhí)行的行為

案例

需求

根據(jù)不同的水果口味,制作不同的蛋糕,比如現(xiàn)在有蘋果味和香蕉味的蛋糕,入?yún)樘O果味,則制作蘋果味蛋糕;入?yún)橄憬段叮瑒t制作香蕉味的蛋糕

實現(xiàn)方案

定義制作蛋糕的抽象類

/**
 * 蛋糕制作抽象類
 * @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();
    }
}

查看測試結(jié)果

Java中怎么用策略模式實現(xiàn)條件判斷

方案分析

通過該案例的實現(xiàn),我們可以看到,使用策略模式+枚舉,替換掉了if--else的硬編碼,并且把不同的策略封裝到了單獨的實現(xiàn)類中,防止一個策略出現(xiàn)問題后影響到其他的策略,提高了系統(tǒng)的可擴展性,最大程度上實現(xiàn)了開閉原則。

總結(jié)

優(yōu)勢

  • 多重條件語句屬于硬編碼不易維護,而使用策略模式可以避免使用多重條件語句

  • 策略模式提供了一系列算法,恰當?shù)氖褂美^承或者實現(xiàn),可以把算法族里面的公共代碼提到父類里面。這樣就會避免重復(fù)的代碼

  • 策略模式可以提供相同行為的不同實現(xiàn),客戶端可以根據(jù)具體的業(yè)務(wù)邏輯去選擇合適的

  • 策略模式完美契合開閉原則,可以在不修改或者少修改源代碼的情況下,靈活增加、減少、修改新 算法

  • 策略模式把算法的使用放到環(huán)境類中,而算法的實現(xiàn)在具體策略類中,實現(xiàn)了二者的分離

劣勢

  • 在實際業(yè)務(wù)邏輯非常復(fù)雜的情況下,會導致出現(xiàn)很多策略類

  • 客戶端必須在恰當?shù)臅r候,使用恰當?shù)乃惴?,才能合理完成業(yè)務(wù)邏輯

讀到這里,這篇“Java中怎么用策略模式實現(xiàn)條件判斷”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI