最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else

 更新時(shí)間:2022年02月24日 14:11:35   作者:溫故知新之java  
策略模式定義了一系列算法,并且將每個(gè)算法封裝起來,使得他們可以相互替換,而且算法的變化不會影響使用算法的客戶端。本文將通過案例講解如何利用Java的策略模式實(shí)現(xiàn)條件判斷,告別if----else條件硬編碼,需要的可以參考一下

定義

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

使用場景

  • 一個(gè)系統(tǒng)需要動態(tài)的在幾種算法中選擇一種,可以把每個(gè)算法封裝到具體的策略類中
  • 一個(gè)類中定義了多種行為,可以去代替條件轉(zhuǎn)移語句,減少硬編碼
  • 系統(tǒng)中各個(gè)算法或者說函數(shù)是彼此獨(dú)立的,而且要求對客戶隱藏算法具體實(shí)現(xiàn)細(xì)節(jié)的時(shí)候
  • 多個(gè)類只區(qū)別在表現(xiàn)行為的不同,可以使用策略模式,在運(yùn)行時(shí)動態(tài)的選擇要執(zhí)行的行為

案例

需求

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

實(shí)現(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é)果

方案分析

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

總結(jié)

優(yōu)勢

  • 多重條件語句屬于硬編碼不易維護(hù),而使用策略模式可以避免使用多重條件語句
  • 策略模式提供了一系列算法,恰當(dāng)?shù)氖褂美^承或者實(shí)現(xiàn),可以把算法族里面的公共代碼提到父類里面。這樣就會避免重復(fù)的代碼
  • 策略模式可以提供相同行為的不同實(shí)現(xiàn),客戶端可以根據(jù)具體的業(yè)務(wù)邏輯去選擇合適的
  • 策略模式完美契合開閉原則,可以在不修改或者少修改源代碼的情況下,靈活增加、減少、修改新 算法
  • 策略模式把算法的使用放到環(huán)境類中,而算法的實(shí)現(xiàn)在具體策略類中,實(shí)現(xiàn)了二者的分離

劣勢

  • 在實(shí)際業(yè)務(wù)邏輯非常復(fù)雜的情況下,會導(dǎo)致出現(xiàn)很多策略類
  • 客戶端必須在恰當(dāng)?shù)臅r(shí)候,使用恰當(dāng)?shù)乃惴?,才能合理完成業(yè)務(wù)邏輯

到此這篇關(guān)于Java利用策略模式實(shí)現(xiàn)條件判斷,告別if else的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中使用雙向鏈表實(shí)現(xiàn)貪吃蛇程序源碼分享

    java中使用雙向鏈表實(shí)現(xiàn)貪吃蛇程序源碼分享

    這篇文章主要介紹了java中使用雙向鏈表實(shí)現(xiàn)貪吃蛇程序源碼分享,本文直接給出了實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-03-03
  • 解決阿里云OSS使用URL無法訪問圖片的兩種方法

    解決阿里云OSS使用URL無法訪問圖片的兩種方法

    這篇文章主要介紹了解決阿里云OSS使用URL無法訪問圖片的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • SpringBoot多模塊如何統(tǒng)一管理

    SpringBoot多模塊如何統(tǒng)一管理

    本文詳細(xì)介紹了SpringBoot多模塊項(xiàng)目的統(tǒng)一管理方法,包括核心思想、Maven和Gradle的統(tǒng)一管理實(shí)踐以及最佳實(shí)踐和技巧,通過集中化配置、約定優(yōu)于配置、減少重復(fù)性工作,可以提高多模塊項(xiàng)目的可維護(hù)性、一致性和可擴(kuò)展性
    2025-03-03
  • Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法

    Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法

    LinkedList是由傳統(tǒng)的鏈表數(shù)據(jù)結(jié)構(gòu)演變而來的,鏈表是一種基本的數(shù)據(jù)結(jié)構(gòu),它可以動態(tài)地增加或刪除元素,下面這篇文章主要給大家介紹了關(guān)于Java語言之LinkedList和鏈表的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2023-05-05
  • IDEA中 Getter、Setter 注解不起作用的問題如何解決

    IDEA中 Getter、Setter 注解不起作用的問題如何解決

    這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問題如何解決,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring中@Import的各種用法以及ImportAware接口詳解

    Spring中@Import的各種用法以及ImportAware接口詳解

    這篇文章主要介紹了Spring中@Import的各種用法以及ImportAware接口詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • java常用工具類之DES和Base64加密解密類

    java常用工具類之DES和Base64加密解密類

    這篇文章主要介紹了java常用工具類之DES和Base64加密解密類,需要的朋友可以參考下
    2014-07-07
  • 關(guān)于jvm內(nèi)存如何查看

    關(guān)于jvm內(nèi)存如何查看

    本文介紹了如何在Java虛擬機(jī)(JVM)中進(jìn)行內(nèi)存管理,包括查看JVM內(nèi)存情況的常用方法和工具,這些方法包括使用JDK自帶的工具如jps、jstat、jmap和jconsole,以及一些第三方監(jiān)控工具如Prometheus、Grafana和ElasticStack等,通過這些方法
    2024-09-09
  • 基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒

    這篇文章主要介紹了基于jenkins構(gòu)建結(jié)果企業(yè)微信提醒,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring AI 入門學(xué)習(xí)指南

    Spring AI 入門學(xué)習(xí)指南

    本文介紹了如何使用SpringAI和Ollama進(jìn)行AI開發(fā),包括如何配置和使用聊天、圖像、語音轉(zhuǎn)文字和文字轉(zhuǎn)語音模型,以及如何在Java項(xiàng)目中集成Ollama模型,感興趣的朋友一起看看吧
    2024-11-11

最新評論

新源县| 松溪县| 平舆县| 柯坪县| 泽库县| 龙岩市| 清徐县| 西和县| 怀仁县| 陇南市| 海南省| 台州市| 西盟| 林周县| 台中市| 屯门区| 南川市| 旌德县| 吐鲁番市| 柘荣县| 新营市| 伊川县| 汽车| 冷水江市| 双辽市| 崇州市| 哈巴河县| 沂南县| 布拖县| 阜城县| 舟曲县| 额济纳旗| 泸水县| 博客| 赣州市| 澄迈县| 双柏县| 彩票| 辽源市| 莲花县| 苍山县|