国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

顛覆認知!我從 Spring 源碼里學到的一個隱藏高手級技巧

開發 前端
當你的代碼中開始出現 3 層以上的 ??if-else??,就是引入策略映射的最佳時機。它不只是設計模式里的教材,更是讓代碼結構清晰可擴展的“生產力工具”。

在日常開發中,我們經常會遇到這樣的場景:根據不同的條件分支執行不同的邏輯。最常見的寫法自然是大量的 if-else 或 switch-case 語句。這種寫法雖然直觀,但隨著業務復雜度提升,代碼的可讀性、可維護性會迅速下降,成為技術債的溫床。

最近我在閱讀 Spring Framework 源碼時,無意中發現它在多個核心模塊中大量使用了一種非常優雅的設計思路 —— 策略映射(Strategy Map),通過它,Spring 實現了對條件分支邏輯的解耦和模塊化。受到啟發后,我將其應用到自己的業務代碼中,效果立竿見影。

本文將通過一個實際案例帶你了解策略映射的使用方式,并展示如何結合注解與工廠模式自動注冊策略實現類,徹底擺脫臃腫邏輯。

場景背景:文件處理服務

我們假設有一個文件上傳處理服務,支持三種文件類型:CSV、JSON 和 XML。用戶上傳文件后,系統會根據文件類型調用不同的解析方法。

原始實現(if-else 地獄)

public void processFile(FileType fileType, InputStream inputStream) {
    if (fileType == FileType.CSV) {
        processCsv(inputStream);
    } else if (fileType == FileType.JSON) {
        processJson(inputStream);
    } else if (fileType == FileType.XML) {
        processXml(inputStream);
    } else {
        throw new IllegalArgumentException("Unsupported file type");
    }
}

問題顯而易見:

  • 職責不清:所有邏輯集中在一個方法中;
  • 擴展困難:增加新類型需改動已有代碼;
  • 測試繁瑣:不能獨立測試某種處理邏輯。

策略模式改寫

Step 1:定義文件類型枚舉

public enum FileType {
    CSV, JSON, XML
}

Step 2:定義統一接口

public interface FileProcessor {
    void process(InputStream inputStream);
}

方法一:基本策略映射(初級)

我們可以用 Spring 自動注入 + 手動注冊策略類:

@Component
public class CsvFileProcessor implements FileProcessor {
    @Override
    public void process(InputStream inputStream) {
        // 解析 CSV
    }
}


@Component
public class JsonFileProcessor implements FileProcessor {
    @Override
    public void process(InputStream inputStream) {
        // 解析 JSON
    }
}

手動維護 Map<FileType, FileProcessor>

@Service
public class FileProcessingService {


    private final Map<FileType, FileProcessor> processorMap = new EnumMap<>(FileType.class);


    @Autowired
    public FileProcessingService(List<FileProcessor> processors) {
        for (FileProcessor processor : processors) {
            if (processor instanceof CsvFileProcessor) {
                processorMap.put(FileType.CSV, processor);
            } else if (processor instanceof JsonFileProcessor) {
                processorMap.put(FileType.JSON, processor);
            }
            // ...
        }
    }


    public void processFile(FileType fileType, InputStream inputStream) {
        FileProcessor processor = processorMap.get(fileType);
        if (processor == null) {
            throw new IllegalArgumentException("Unsupported file type: " + fileType);
        }
        processor.process(inputStream);
    }
}

雖然比 if-else 好一些,但仍需手動維護映射,擴展成本仍在。

方法二:注解式自動注冊(高級推薦)

目標:

讓每個處理器類用注解聲明其支持的文件類型,然后由統一的“策略工廠”自動注冊進映射容器,徹底做到零修改、自動發現、自動注冊

定義策略注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FileTypeHandler {
    FileType value();
}
修改處理器實現類
@Component
@FileTypeHandler(FileType.CSV)
public class CsvFileProcessor implements FileProcessor {
    @Override
    public void process(InputStream inputStream) {
        System.out.println("處理 CSV 文件");
    }
}


@Component
@FileTypeHandler(FileType.JSON)
public class JsonFileProcessor implements FileProcessor {
    @Override
    public void process(InputStream inputStream) {
        System.out.println("處理 JSON 文件");
    }
}
編寫策略工廠
@Component
public class FileProcessorFactory implements ApplicationContextAware {


    private final Map<FileType, FileProcessor> processorMap = new EnumMap<>(FileType.class);


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, FileProcessor> beans = applicationContext.getBeansOfType(FileProcessor.class);
        for (FileProcessor processor : beans.values()) {
            FileTypeHandler annotation = processor.getClass().getAnnotation(FileTypeHandler.class);
            if (annotation != null) {
                processorMap.put(annotation.value(), processor);
            }
        }
    }


    public FileProcessor getProcessor(FileType type) {
        FileProcessor processor = processorMap.get(type);
        if (processor == null) {
            throw new IllegalArgumentException("未支持的文件類型: " + type);
        }
        return processor;
    }
}
服務類調用更簡潔
@Service
public class FileProcessingService {


    private final FileProcessorFactory factory;


    @Autowired
    public FileProcessingService(FileProcessorFactory factory) {
        this.factory = factory;
    }


    public void processFile(FileType type, InputStream inputStream) {
        factory.getProcessor(type).process(inputStream);
    }
}

總結:策略映射的進階之道

實現方式

可擴展性

可讀性

解耦程度

推薦程度

if-else/switch-case

耦合嚴重

 不推薦

手動構建 Map

一般

部分解耦

 可用

注解 + 工廠自動注冊

完全解耦

 強烈推薦

策略映射 + 注解注冊,是應對多分支邏輯的一種現代、模塊化、可維護的架構方式。Spring 中諸如 HandlerAdapterConverterMessageConverter 等核心機制大量應用了這一思路。

寫在最后

當你的代碼中開始出現 3 層以上的 if-else,就是引入策略映射的最佳時機。它不只是設計模式里的教材,更是讓代碼結構清晰可擴展的“生產力工具”。

與其維護一個千瘡百孔的 if 邏輯,不如優雅地構建一個策略工廠。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2020-04-03 09:45:09

Java多線程接口

2020-06-14 15:09:00

JavaScript開發技術

2022-03-21 10:21:50

jQuery代碼模式

2013-06-25 11:06:51

編程技巧蘋果

2022-03-27 09:06:04

React類型定義前端

2018-08-15 10:51:01

JavaSpring MVC框架

2015-06-29 13:47:19

創業創業智慧

2021-01-04 09:06:18

Next.js設計技巧

2024-04-15 12:54:00

ReactVue列表邏輯

2015-06-01 06:42:50

開源公司三大教訓

2011-07-11 10:34:40

編程技巧蘋果

2021-03-09 09:55:02

Vuejs前端代碼

2019-12-04 07:39:07

MySQL索引數據庫

2019-09-03 10:59:28

SQL索引語句

2021-04-15 08:15:27

Vue.js源碼方法

2013-06-27 10:31:39

2021-05-14 05:18:36

Vite2issues項目

2014-12-22 10:09:50

工程師

2010-12-02 11:01:23

職場經驗

2023-11-14 11:18:13

點贊
收藏

51CTO技術棧公眾號

国产成人a亚洲精品| 日本一区二区不卡高清更新| 啊v在线视频| 美女视频一区免费观看| 成人免费黄色| 色婷婷国产精品综合在线观看| 亚洲高清在线播放| 亚洲网站情趣视频| 最新日韩av在线| www日韩中文字幕在线看| 午夜午夜精品一区二区三区文| 卡通动漫国产精品| 亚洲精品国产精品国自产在线| 免费黄色在线网站| 欧美日韩国产综合视频在线观看| 在线小视频网址| 在线观看国产91| 尤物在线网址| 国产网站欧美日韩免费精品在线观看| 日韩国产欧美精品| 奇米精品一区二区三区在线观看一 | 欧美日韩福利视频| 成全视频在线播放大地| 国产精品沙发午睡系列990531| 日韩av片网站| 亚洲91视频| 亚洲a成v人在线观看| 亚洲区综合中文字幕日日| 欧美本精品男人aⅴ天堂| 日本在线播放一二三区| 最新中文字幕亚洲| 国产厕拍一区| 亚洲一区二区久久久久久久| 日韩国产精品久久久| 一本大道熟女人妻中文字幕在线| 亚洲欧美视频一区| 毛片免费不卡| 久久福利视频网| 91精品国产91久久久久久黑人| 99超碰麻豆| 国产精品一区二区在线播放| 日本熟妇人妻xxxxx| 精品动漫一区二区| 欧美日韩在线免费播放| 麻豆成全视频免费观看在线看| 亚洲性视频网站| 国产一区二区三区电影在线观看 | 99一区二区三区| 国产成人超碰人人澡人人澡| 欧美成人免费小视频| 伊人久久大香线蕉综合网蜜芽| 国产成人看片| 欧美一级大片在线视频| 国产精品福利视频| 久久久99久久| 亚洲按摩av| 在线精品视频免费播放| 精品一区二区三区四区五区| 97netav| 自由日本语亚洲人高潮| avav在线播放| 欧美一区二区三区四区在线观看| 三级国产三级在线| 日韩激情视频在线播放| 国产精品国产一区| 96精品视频在线| 亚洲精品视频一二三区| 色噜噜国产精品视频一区二区 | www亚洲成人| 亚洲色图在线观看| 黄色网在线看| 波多野结衣成人在线| 性欧美大战久久久久久久久| 国产精品视频分类| 日韩一区二区av| 国产成人精品1024| 蜜臀av国内免费精品久久久夜夜| 国产高清在线一区二区| 色老汉一区二区三区| 麻豆视频在线| 国产精品美女在线| 999久久精品| 欧美一级视频在线观看| 欧美aaaaa级| 日本www在线播放| 中文字幕成人在线| 99re这里只有精品视频首页| 日韩福利影视| 韩国v欧美v日本v亚洲| 忘忧草精品久久久久久久高清| 天堂在线观看一卡二卡三卡四卡| 国产成人精品优优av| 婷婷国产v国产偷v亚洲高清| 欧美不卡视频| 超碰在线视屏| 丰满少妇被猛烈进入高清播放| 欧美激情va永久在线播放| 国产精品久久久久四虎| 99久久久久| 免费在线观看av电影| 成人看片app| 3atv在线一区二区三区| 国产suv精品一区二区三区| 欧美三级午夜理伦三级在线观看| 亚洲色图16p| 国产在线无码精品| 日韩理论片一区二区| ww国产内射精品后入国产| 日韩激情片免费| 亚洲国产精品人人做人人爽| 国产精品实拍| 亚洲 欧美 日韩 国产综合 在线| 欧美自拍大量在线观看| 日韩女优视频免费观看| 国产精品久久久久久久午夜片| 狠狠88综合久久久久综合网| 青青草精品视频在线| 成人激情av在线| 中文字幕一区二区三区乱码在线| 极品裸体白嫩激情啪啪国产精品| 国产亚洲精aa在线看| 日本三级视频在线播放| 蜜桃视频免费网站| 国产综合av在线| 蜜桃视频在线观看成人| 日韩欧美黄色动漫| 国产精品一区二区x88av| 一区二区小说| 6080成人| 亚洲福利av在线| 欧美日韩一区二区三区免费| 亚洲一区二区中文| 国产精品美女久久久久久免费 | 奇米四色中文综合久久| 操日韩av在线电影| 日韩中文综合网| 色爱av美腿丝袜综合粉嫩av| 亚洲精品美女免费| 日韩国产精品一区| 日韩电影第一页| 国产一区二区三区视频在线观看 | 无码日韩人妻精品久久蜜桃| 日本三级免费网站| 99视频免费播放| 欧美私人情侣网站| 第四色亚洲色图| 国产精品区在线| av成人动漫| 自拍视频在线免费观看| 成a人片在线观看| 日日夜夜天天综合| 久草精品视频| 日韩综合网站| 日日夜夜精品视频天天综合网| 日韩极品在线观看| 国产成人99久久亚洲综合精品| 国产视频911| 精品高清美女精品国产区| 日韩欧美一区电影| 久久精品国产亚洲精品2020| 69av在线播放| 国内一区二区在线视频观看 | 国产成人精品三级高清久久91| 免费观看久久av| 毛片一区二区| 久久日韩精品一区二区五区| 成人动态视频| 亚洲精品美女91| 要久久爱电视剧全集完整观看| av丝袜天堂网| 久久精品影视大全| 在线播放av网站| 自拍偷自拍亚洲精品被多人伦好爽| 黑人精品视频| 久久久久黄色| 国产视频手机在线播放| 男人的天堂在线免费视频| av中文在线资源库| 91成人噜噜噜在线播放| 欧美成人日韩| 顶级嫩模精品视频在线看| 午夜视频在线观看一区二区| 日韩精品一区二区三区老鸭窝 | 欧美一区二区三区四区在线观看| 国内免费精品永久在线视频| 欧美久久在线| 69免费视频| 欧美亚洲黄色| 爽好久久久欧美精品| 中文字幕免费不卡在线| 亚洲欧美日韩中文视频| 一本一本a久久| 91极品女神在线| 成人情趣片在线观看免费| 中文字幕在线亚洲精品| 清纯唯美亚洲激情| 午夜午夜精品一区二区三区文| 日本在线观看免费视频| 中文字幕免费高清电视剧网站在线观看 | 国产精品久久久久不卡|