RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何通過(guò)策略模式簡(jiǎn)化if-else

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 16:08 ? 次閱讀

相信大家日常開(kāi)發(fā)中會(huì)經(jīng)常寫(xiě)各種分支判斷語(yǔ)句,比如 if-else ,當(dāng)分支較多時(shí),代碼看著會(huì)比較臃腫,那么如何優(yōu)化呢?

1、什么是策略模式?

Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

策略模式(Strategy Pattern):定義一族算法類,將每個(gè)算法分別封裝起來(lái),讓它們可以互相替換。

2、策略模式定義

圖片

①、Context封裝角色

它也叫做上下文角色, 起承上啟下封裝作用, 屏蔽高層模塊對(duì)策略、 算法的直接訪問(wèn),封裝可能存在的變化。

②、Strategy 抽象策略角色

策略、 算法家族的抽象, 通常為接口, 定義每個(gè)策略或算法必須具有的方法和屬性。

③、ConcreteStrategy 具體策略角色

實(shí)現(xiàn)抽象策略中的操作, 該類含有具體的算法。

3、策略模式通用代碼

public class Context {
    // 抽象策略
    private Strategy strategy = null;
    // 構(gòu)造函數(shù)設(shè)置具體策略
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    // 封裝后的策略方法
    public void doAnything(){
        this.strategy.doSomething();
    }
}
public interface Strategy {
    // 策略模式的運(yùn)算法則
    public void doSomething();
}
public class ConcreteStrategy1 implements Strategy{
    @Override
    public void doSomething() {
        System.out.println("ConcreteStrategy1");
    }
}
public class ConcreteStrategy2 implements Strategy{
    @Override
    public void doSomething() {
        System.out.println("ConcreteStrategy2");
    }
}

測(cè)試:

public class StrategyClient {
    public static void main(String[] args) {
        // 聲明一個(gè)具體的策略
        Strategy strategy = new ConcreteStrategy1();
        // 聲明上下文對(duì)象
        Context context = new Context(strategy);
        // 執(zhí)行封裝后的方法
        context.doAnything();
    }
}

4、用策略模式改寫(xiě)if-else

假設(shè)我們要處理一個(gè)office文件,分為三種類型 docx、xlsx、pptx,分別表示W(wǎng)ord文件、Excel文件、PPT文件,根據(jù)文件后綴分別解析。

4.1 常規(guī)寫(xiě)法

public class OfficeHandler {

    public void handleFile(String filePath){
        if(filePath == null){
            return;
        }
        String fileExtension = getFileExtension(filePath);
        if(("docx").equals(fileExtension)){
            handlerDocx(filePath);
        }else if(("xlsx").equals(fileExtension)){
            handlerXlsx(filePath);
        }else if(("pptx").equals(fileExtension)){
            handlerPptx(filePath);
        }
    }

    public void handlerDocx(String filePath){
        System.out.println("處理docx文件");
    }
    public void handlerXlsx(String filePath){
        System.out.println("處理xlsx文件");
    }
    public void handlerPptx(String filePath){
        System.out.println("處理pptx文件");
    }
    private static String getFileExtension(String filePath){
        // 解析文件名獲取文件擴(kuò)展名,比如 文檔.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

處理邏輯全部放在一個(gè)類中,會(huì)導(dǎo)致整個(gè)類特別龐大,假設(shè)我們要新增一種類型處理,比如對(duì)于2007版之前的office文件,后綴分別是 doc/xls/ppt,那我們得增加 else if 邏輯,違反了開(kāi)閉原則,如何解決這種問(wèn)題呢,答案就是通過(guò)策略模式。

4.2 策略模式改寫(xiě)

public interface OfficeHandlerStrategy {
    void handlerOffice(String filePath);
}
public class OfficeHandlerDocxStrategy implements OfficeHandlerStrategy {
    @Override
    public void handlerOffice(String filePath) {
        System.out.println("處理docx");
    }
}

// 省略 OfficeHandlerXlsxStrategy/OfficeHandlerPptxStrategy 類

public class OfficeHandlerStrategyFactory {
    private static final Map< String,OfficeHandlerStrategy > map = new HashMap<  >();
    static {
        map.put("docx",new OfficeHandlerDocxStrategy());
        map.put("xlsx",new OfficeHandlerXlsxStrategy());
        map.put("pptx",new OfficeHandlerPptxStrategy());
    }
    public static OfficeHandlerStrategy getStrategy(String type){
        return map.get(type);
    }
}

測(cè)試:

public class OfficeHandlerStrategyClient {
    public static void main(String[] args) {
        String filePath = "C://file/123.xlsx";
        String type = getFileExtension(filePath);
        OfficeHandlerStrategy strategy = OfficeHandlerStrategyFactory.getStrategy(type);
        strategy.handlerOffice(filePath);
    }

    private static String getFileExtension(String filePath){
        // 解析文件名獲取文件擴(kuò)展名,比如 文檔.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

4、策略模式優(yōu)點(diǎn)

①、算法可以自由切換

這是策略模式本身定義的, 只要實(shí)現(xiàn)抽象策略, 它就成為策略家族的一個(gè)成員, 通過(guò)封裝角色對(duì)其進(jìn)行封裝, 保證對(duì)外提供“可自由切換”的策略。

②、避免使用多重條件判斷

簡(jiǎn)化多重if-else,或多個(gè)switch-case分支。

③、擴(kuò)展性良好

增加一個(gè)策略,只需要實(shí)現(xiàn)一個(gè)接口即可。

5、策略模式應(yīng)用場(chǎng)景

①、多個(gè)類只有在算法或行為上稍有不同的場(chǎng)景。

②、算法需要自由切換的場(chǎng)景。

③、需要屏蔽算法規(guī)則的場(chǎng)景。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8573

    瀏覽量

    151004
  • 封裝
    +關(guān)注

    關(guān)注

    126

    文章

    7871

    瀏覽量

    142884
  • 文件
    +關(guān)注

    關(guān)注

    1

    文章

    565

    瀏覽量

    24725
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4327

    瀏覽量

    62564
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4778

    瀏覽量

    68513
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句詳解

    在C語(yǔ)言中,有三種條件判斷結(jié)構(gòu):if語(yǔ)句、if-else語(yǔ)句和switch語(yǔ)句。
    發(fā)表于 08-18 16:36 ?1.2w次閱讀
    C語(yǔ)言中if語(yǔ)句、<b class='flag-5'>if-else</b>語(yǔ)句和switch語(yǔ)句詳解

    煉獄傳奇-if_else與case之戰(zhàn)

    Verilog HDL語(yǔ)言中存在兩種分支語(yǔ)言:● if-else 條件分支語(yǔ)句● case 分支控制語(yǔ)句1. if-else條件分支語(yǔ)句if-else 條件分支語(yǔ)句的作用是根據(jù)指定的判斷條件是否滿足
    發(fā)表于 03-31 09:51

    【verilog每日一練】if_else語(yǔ)句優(yōu)先級(jí)

    利用if_else語(yǔ)句中多個(gè)條件的優(yōu)先級(jí)關(guān)系實(shí)現(xiàn):將變量a[5:0]的十進(jìn)制中的十位對(duì)應(yīng)的數(shù)字提取出來(lái),并且將十位對(duì)應(yīng)的數(shù)字賦值給變量b[3:0],要求每個(gè)if-else語(yǔ)句中每個(gè)條件表達(dá)式只允許使用一個(gè)關(guān)系運(yùn)算符
    發(fā)表于 08-10 09:53

    Proteus之if-else語(yǔ)句的應(yīng)用

    Proteus之if-else語(yǔ)句的應(yīng)用,很好的Proteus資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-18 14:49 ?0次下載

    FPGA學(xué)習(xí)系列:if-else與case

    設(shè)計(jì)背景:不管是在什么軟件和硬件語(yǔ)言,我們?cè)谖覀兊拇a中都或多或少的用到這兩條語(yǔ)句,if..else與case語(yǔ)句,今天我們將學(xué)習(xí)verilog中的這兩條語(yǔ)句,其實(shí)不管在什么語(yǔ)言中這兩個(gè)語(yǔ)句都是一樣
    的頭像 發(fā)表于 06-01 16:59 ?1.2w次閱讀
    FPGA學(xué)習(xí)系列:<b class='flag-5'>if-else</b>與case

    從入門(mén)到高級(jí)替換If-Else的5種方法示例

    ,它導(dǎo)致設(shè)計(jì)復(fù)雜,代碼可讀性差,并且可能導(dǎo)致重構(gòu)困難。 但是,If-Else 已成為事實(shí)上的代碼分支解決方案,這確實(shí)是有道理的。這是向所有有抱負(fù)的開(kāi)發(fā)人員講授的第一件事。 不幸的是,許多開(kāi)發(fā)人員從來(lái)沒(méi)有前進(jìn)到更合適的分支策略。有些人的口頭禪是:I
    的頭像 發(fā)表于 02-20 16:27 ?6817次閱讀
    從入門(mén)到高級(jí)替換<b class='flag-5'>If-Else</b>的5種方法示例

    不會(huì)有人不知道怎么優(yōu)雅的替換if-else語(yǔ)句吧

    來(lái)自:love1024.blog.csdn.net/article/details/104955363 場(chǎng)景日常開(kāi)發(fā),if-else語(yǔ)句寫(xiě)的不少吧??當(dāng)邏輯分支非常多的時(shí)候,if-else套了一層
    的頭像 發(fā)表于 07-28 15:46 ?1420次閱讀
    不會(huì)有人不知道怎么優(yōu)雅的替換<b class='flag-5'>if-else</b>語(yǔ)句吧

    不同規(guī)則引擎在核心編排上的優(yōu)缺點(diǎn)

    業(yè)務(wù)中是否寫(xiě)了大量的 if-else?是否受夠了這些 if-else 還要經(jīng)常變動(dòng)?業(yè)務(wù)中是否做了大量抽象,發(fā)現(xiàn)新的業(yè)務(wù)場(chǎng)景還是用不上?
    的頭像 發(fā)表于 08-08 15:23 ?1648次閱讀

    關(guān)于Python中的“for-else”功能

    無(wú)論使用哪種編程語(yǔ)言,我們都會(huì)編寫(xiě)“if-else”語(yǔ)句,但是“for-else”呢?
    發(fā)表于 09-26 14:44 ?548次閱讀

    設(shè)計(jì)模式最佳實(shí)踐探索—策略模式

    根據(jù)不同的應(yīng)用場(chǎng)景與意圖,設(shè)計(jì)模式主要分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式三類。本文主要探索行為型模式中的
    的頭像 發(fā)表于 10-31 14:24 ?938次閱讀

    解鎖新姿勢(shì):干掉過(guò)多的if-else!

    這點(diǎn)非常容易理解,就是說(shuō)在業(yè)務(wù)邏輯里面,先把不符合條件的給先過(guò)濾掉,而不是層層嵌套if-else判斷
    的頭像 發(fā)表于 11-12 10:01 ?658次閱讀

    什么是SystemVerilog-決策語(yǔ)句-if-else語(yǔ)句?

    決策語(yǔ)句(Decision statements)允許程序塊的執(zhí)行流程根據(jù)設(shè)計(jì)中信號(hào)的當(dāng)前值分支到特定語(yǔ)句。SystemVerilog有兩個(gè)主要的決策語(yǔ)句:if…else語(yǔ)句和case語(yǔ)句,使用關(guān)鍵字case、case…inside,casex和casez。
    的頭像 發(fā)表于 02-09 14:15 ?1154次閱讀
    什么是SystemVerilog-決策語(yǔ)句-<b class='flag-5'>if-else</b>語(yǔ)句?

    設(shè)計(jì)模式行為型:策略模式

    策略模式(Strategy Pattern)中,一個(gè)類的行為或其算法可以在運(yùn)行時(shí)更改。這種類型的設(shè)計(jì)模式屬于行為型模式。
    的頭像 發(fā)表于 06-07 11:18 ?659次閱讀
    設(shè)計(jì)<b class='flag-5'>模式</b>行為型:<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    什么是策略模式

    什么是策略模式 官話: 策略模式(Strategy Pattern): 定義一系列算法類,將每一個(gè)算法封裝起來(lái),并讓它們可以相互替換,策略
    的頭像 發(fā)表于 10-08 14:15 ?2690次閱讀
    什么是<b class='flag-5'>策略</b><b class='flag-5'>模式</b>

    Verilog代碼:if-else和case的電路結(jié)構(gòu)和區(qū)別

    每個(gè)if-else就是一個(gè)2選1mux器。當(dāng)信號(hào)有明顯優(yōu)先級(jí)時(shí),首先要考慮if-else,但是if嵌套過(guò)多也會(huì)導(dǎo)致速度變慢;if語(yǔ)句結(jié)構(gòu)較慢,但占用面積小。 嵌套的if語(yǔ)句如果使用不當(dāng),就會(huì)
    的頭像 發(fā)表于 11-29 15:10 ?3149次閱讀
    RM新时代网站-首页