在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何通過策略模式簡化if-else

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-08 16:08 ? 次閱讀

相信大家日常開發中會經常寫各種分支判斷語句,比如 if-else ,當分支較多時,代碼看著會比較臃腫,那么如何優化呢?

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):定義一族算法類,將每個算法分別封裝起來,讓它們可以互相替換。

2、策略模式定義

圖片

①、Context封裝角色

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

②、Strategy 抽象策略角色

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

③、ConcreteStrategy 具體策略角色

實現抽象策略中的操作, 該類含有具體的算法。

3、策略模式通用代碼

public class Context {
    // 抽象策略
    private Strategy strategy = null;
    // 構造函數設置具體策略
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    // 封裝后的策略方法
    public void doAnything(){
        this.strategy.doSomething();
    }
}
public interface Strategy {
    // 策略模式的運算法則
    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");
    }
}

測試:

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

4、用策略模式改寫if-else

假設我們要處理一個office文件,分為三種類型 docx、xlsx、pptx,分別表示Word文件、Excel文件、PPT文件,根據文件后綴分別解析。

4.1 常規寫法

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){
        // 解析文件名獲取文件擴展名,比如 文檔.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

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

4.2 策略模式改寫

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);
    }
}

測試:

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){
        // 解析文件名獲取文件擴展名,比如 文檔.docx,返回 docx
        String fileExtension = filePath.substring(filePath.lastIndexOf(".")+1);
        return fileExtension;
    }
}

4、策略模式優點

①、算法可以自由切換

這是策略模式本身定義的, 只要實現抽象策略, 它就成為策略家族的一個成員, 通過封裝角色對其進行封裝, 保證對外提供“可自由切換”的策略。

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

簡化多重if-else,或多個switch-case分支。

③、擴展性良好

增加一個策略,只需要實現一個接口即可。

5、策略模式應用場景

①、多個類只有在算法或行為上稍有不同的場景。

②、算法需要自由切換的場景。

③、需要屏蔽算法規則的場景。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8662

    瀏覽量

    151480
  • 封裝
    +關注

    關注

    127

    文章

    7960

    瀏覽量

    143152
  • 文件
    +關注

    關注

    1

    文章

    569

    瀏覽量

    24775
  • 函數
    +關注

    關注

    3

    文章

    4340

    瀏覽量

    62791
  • 代碼
    +關注

    關注

    30

    文章

    4807

    瀏覽量

    68787
收藏 人收藏

    評論

    相關推薦

    C語言中if語句、if-else語句和switch語句詳解

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

    煉獄傳奇-if_else與case之戰

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

    【verilog每日一練】if_else語句優先級

    利用if_else語句中多個條件的優先級關系實現:將變量a[5:0]的十進制中的十位對應的數字提取出來,并且將十位對應的數字賦值給變量b[3:0],要求每個if-else語句中每個條件表達式只允許使用一個關系運算符
    發表于 08-10 09:53

    Proteus之if-else語句的應用

    Proteus之if-else語句的應用,很好的Proteus資料,快來學習吧。
    發表于 04-18 14:49 ?0次下載

    FPGA學習系列:if-else與case

    設計背景:不管是在什么軟件和硬件語言,我們在我們的代碼中都或多或少的用到這兩條語句,if..else與case語句,今天我們將學習verilog中的這兩條語句,其實不管在什么語言中這兩個語句都是一樣
    的頭像 發表于 06-01 16:59 ?1.2w次閱讀
    FPGA學習系列:<b class='flag-5'>if-else</b>與case

    從入門到高級替換If-Else的5種方法示例

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

    不會有人不知道怎么優雅的替換if-else語句吧

    來自:love1024.blog.csdn.net/article/details/104955363 場景日常開發,if-else語句寫的不少吧??當邏輯分支非常多的時候,if-else套了一層
    的頭像 發表于 07-28 15:46 ?1459次閱讀
    不會有人不知道怎么優雅的替換<b class='flag-5'>if-else</b>語句吧

    不同規則引擎在核心編排上的優缺點

    業務中是否寫了大量的 if-else?是否受夠了這些 if-else 還要經常變動?業務中是否做了大量抽象,發現新的業務場景還是用不上?
    的頭像 發表于 08-08 15:23 ?1686次閱讀

    關于Python中的“for-else”功能

    無論使用哪種編程語言,我們都會編寫“if-else”語句,但是“for-else”呢?
    發表于 09-26 14:44 ?555次閱讀

    解鎖新姿勢:干掉過多的if-else

    這點非常容易理解,就是說在業務邏輯里面,先把不符合條件的給先過濾掉,而不是層層嵌套if-else判斷
    的頭像 發表于 11-12 10:01 ?670次閱讀

    什么是SystemVerilog-決策語句-if-else語句?

    決策語句(Decision statements)允許程序塊的執行流程根據設計中信號的當前值分支到特定語句。SystemVerilog有兩個主要的決策語句:if…else語句和case語句,使用關鍵字case、case…inside,casex和casez。
    的頭像 發表于 02-09 14:15 ?1206次閱讀
    什么是SystemVerilog-決策語句-<b class='flag-5'>if-else</b>語句?

    設計模式行為型:策略模式

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

    什么是策略模式

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

    Verilog代碼:if-else和case的電路結構和區別

    每個if-else就是一個2選1mux器。當信號有明顯優先級時,首先要考慮if-else,但是if嵌套過多也會導致速度變慢;if語句結構較慢,但占用面積小。 嵌套的if語句如果使用不當,就會
    的頭像 發表于 11-29 15:10 ?3464次閱讀

    設計模式-策略模式

    作者:京東工業 孫磊 一、概念 策略模式(Strategy Pattern)也稱為(Policy Parttern)。 它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變換
    的頭像 發表于 01-08 13:47 ?69次閱讀
    設計<b class='flag-5'>模式</b>-<b class='flag-5'>策略</b><b class='flag-5'>模式</b>
    主站蜘蛛池模板: 亚洲综合区图片小说区| 在线亚洲色图| 四虎影视大全免费入口| 美国69bj| 黑人xxxx精品| 午夜爽视频| 最新地址四虎www4hutv| 91夫妻视频| 亚洲综合一区二区| 床上激情四射| 五月天婷婷一区二区三区久久| 天堂资源在线观看| 日本黄色片段| 国产亚洲视频在线播放大全| 大看蕉a在线观看| 天天干天天干天天干天天干天天干| 免费又爽又黄的禁片1000部 | 婷婷欧美| 男人天堂网在线| 四虎在线视频观看| 日本三级人妇| 国模私拍一区二区| 午夜精品久久久久久91| 成人午夜久久| 欧洲精品不卡1卡2卡三卡四卡| 一级 黄 色 片免费| 色咯咯| 激情五月婷婷久久| 五月天婷亚洲| 欧美在线三级| 伊人一区二区三区| 欧美日韩一区二区三区视频在线观看| 国模吧在线视频| 特黄级| 四色成人网| 综合7799亚洲伊人爱爱网| 老师啊灬啊灬用力啊快224视频| 性欧美videofree视频另类| 你懂的福利| 有坂深雪在线| wwwxxx亚洲|