用策略模式幹掉代碼里大量的if-eles或則Swatch,提升B格由面向過程轉為面向對象

来源:https://www.cnblogs.com/gtnotgod/archive/2023/09/28/17736200.html
-Advertisement-
Play Games

現象 大量的分支選擇型代碼段看著讓人頭疼 for (Field field : declaredFields) { Class<?> type = field.getType(); String key = field.getName(); Element result = resultMap.ad ...


現象 大量的分支選擇型代碼段看著讓人頭疼

  for (Field field : declaredFields) {
            Class<?> type = field.getType();
            String key = field.getName();
            Element result = resultMap.addElement("result");
            result.addAttribute("column", StringChangeUtils.CamelhumpToUnderline(key).toLowerCase());
            result.addAttribute("property", key);
            switch (type.getSimpleName()) {
                case "String":
                    result.addAttribute("jdbcType", "VARCHAR");
                    break;
                case "Integer":
                    result.addAttribute("jdbcType", "NUMERIC");
                    break;
                case "Double":
                    result.addAttribute("jdbcType", "NUMERIC");
                    break;
                case "Date":
                    result.addAttribute("jdbcType", "DATE");
                    break;
                default:
                    result.addAttribute("jdbcType", "VARCHAR");
                    break;
            }

        }

如何重構成為策略模式,由硬編碼的面向過程編程走向面對對象呢

其實很簡單 if裡面的多個魔法常量 和HashMap裡面的key是不是可以等比互換呢!!
所以我們核心就是從一個類似於HashMap這種的容器里去獲取某一個key,就等同於進去到了if 的對應分支
而if 的對應分支 裡面的業務,交給HashMap的Value去調方法完成沒毛病把

第一步抽象化這個if分支的邏輯 ---- 分析

--比如上述代碼是判斷欄位類型 --->通用對象介面是對象類型的·抽象·
-- 那麼這個對象具有什麼能力,就是對應原始if分支的邏輯處理 唄,,
-- 我這裡是根據不同的欄位類型往一個Element元素對象中填充屬性。 -----所以抽出行為為往Element元素對象中填充屬性

第二步抽象化這個if分支的邏輯----- 實現

public interface FileTypeInterfaceStrategy {

    void addAttribute(Element element);
}

第三步抽象if分支的種類,不同種類有不同實現,-----分析

1. 比如 類型抽象 有String  類型 
2. 比如 類型抽象 有Double  類型 
3. 比如 類型抽象 有DATE  類型 
4. 等等。。。。。

第四步抽象if分支的種類,不同種類有不同實現,-----實現

  1. 比如 類型抽象 有String 類型 實現
public class StringStrategy implements FileTypeInterfaceStrategy {
    @Override
    public void addAttribute(Element element) {
        element.addAttribute("jdbcType", "VARCHAR");
    }
}

  1. 比如 類型抽象 有Integer 類型 實現
public class IntegerStrategy implements FileTypeInterfaceStrategy {
    @Override
    public void addAttribute(Element element) {
        element.addAttribute("jdbcType", "NUMERIC");
    }
}
  1. 比如 類型抽象 有Double 類型 實現
public class DoubleStrategy implements FileTypeInterfaceStrategy {
    @Override
    public void addAttribute(Element element) {
        element.addAttribute("jdbcType", "NUMERIC");
    }
}
  1. 比如 類型抽象 有Date 類型 實現
public class DateStrategy implements FileTypeInterfaceStrategy {
    @Override
    public void addAttribute(Element element) {
        element.addAttribute("jdbcType", "DATE");
    }
}
  1. 比如 類型抽象 有其他 類型 實現
public class DefaultStrategy implements FileTypeInterfaceStrategy {
    @Override
    public void addAttribute(Element element) {
        element.addAttribute("jdbcType", "VARCHAR");
    }
}

第五步if分支的過程編程已經抽離為對象行為編程----目前如何嵌入業務分析

 思考  if選擇分支,第一件事是不是拿到一個值去判斷屬於某一個魔法常量呢!
 其實 抽離成對象之後業同理需要知道,這裡的上文行為需要下文的那一個對象的實現去處理。。
 比如,上文中拿到String、類型,我需要使用String類型的實現類去調業務方法。
 比如,上文中拿到Integer、類型,我需要使用Integer類型的實現類去調業務方法。

if的分支屬性和業務行為被抽離成對象--但是還有個東西沒有抽離,就是IF本身的分支選擇結構沒抽出來 對不對
這時候聯想到第一句話:if本身業務結構還需要抽離-----它本身和HashMaP這種結構類似 是不是可以用它完成替換

第六步if分支的過程編程已經抽離為對象行為編程----目前如何嵌入業務實現

使用工廠方法代理策略的選擇執行:其實很簡單,就是new 一個HashMap,然後把所有的策略對象和Key放入HashMap,使用時候去容器裡面取出來執行業務方法就完事

public class FileTypeStrategyFactory {

    private FileTypeStrategyFactory() {

    }

    private static final FileTypeStrategyFactory bean = new FileTypeStrategyFactory();

    public static FileTypeStrategyFactory getBean() {
        return bean;
    }

    /**
     * 聲明存儲容器
     */
    private static Map<String, FileTypeInterfaceStrategy> factoryMap;

    static {
        factoryMap = new HashMap<>();
        factoryMap.put("String", new StringStrategy());
        factoryMap.put("Integer", new IntegerStrategy());
        factoryMap.put("Double", new DoubleStrategy());
        factoryMap.put("Date", new DateStrategy());
        factoryMap.put("default", new DefaultStrategy());
    }


    public FileTypeInterfaceStrategy getStrategy(String classType) {
        return factoryMap.get(classType) != null ? factoryMap.get(classType) : factoryMap.get("default");
    }
}

替換原始代碼;

        Element resultMap = document.addElement("resultMap");
        // 添加根節點屬性
        resultMap.addAttribute("id", aClass.getSimpleName() + "Map");
        resultMap.addAttribute("type", classForName);
        resultMap.addAttribute("extends", "BaseResultMap");
        for (Field field : declaredFields) {
            Class<?> type = field.getType();
            String key = field.getName();
            Element result = resultMap.addElement("result");
            result.addAttribute("column", StringChangeUtils.CamelhumpToUnderline(key).toLowerCase());
            result.addAttribute("property", key);
            FileTypeStrategyFactory factory = FileTypeStrategyFactory.getBean();
            FileTypeInterfaceStrategy strategy = factory.getStrategy(type.getSimpleName());
            strategy.addAttribute(result);
        }

策略模式+工廠方法 ----->無縫替換if-else-switch:面向過程---到面向對象是思維的轉變 完結!!!!

作者:隔壁老郭 出處:http://www.cnblogs.com/gtnotgod】/

----------隔壁老郭還有大號:隔壁老郭---------------------------------

個性簽名:獨學而無友,則孤陋而寡聞。做一個靈魂有趣的人!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!

萬水千山總是情,打賞一分行不行,所以如果你心情還比較高興,也是可以掃碼打賞博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用雙指針進行原地移除元素 題目描述 給定一個數組 nums 和一個值 val,需要將數組中所有等於 val 的元素原地刪除,並返回刪除後數組的新長度。 要求: 不使用額外的數組空間 只能使用 O(1) 額外空間 數組中超過新長度後面的元素可以忽略 示例 1: 輸入:nums = [3,2,2,3] ...
  • 在Python中,字元串可以用單引號或雙引號括起來。'hello' 與 "hello" 是相同的。您可以使用print()函數顯示字元串文字: 示例: print("Hello") print('Hello') 將字元串分配給變數是通過變數名後跟等號和字元串完成的: 示例 a = "Hello" p ...
  • 前言 ThreadLocal可以用來存儲線程的本地數據,做到線程數據的隔離 ThreadLocal的使用不當可能會導致記憶體泄漏,排查記憶體泄漏的問題,不僅需要熟悉JVM、利用好各種分析工具還耗費人工 如果能明白其原理並正確使用,就不會導致各種意外發生 本文將從使用場景、實現原理、記憶體泄漏、設計思想等層 ...
  • 目錄場景1 定義全部異常處理類2 替換request引用3 代碼優化總結 場景 本文前端用的是阿裡的Ant-Design框架,其他框架也有全局攔截器,思路是相同,具體實現自行百度下吧 因為每次都需要調介面,都需要單獨處理異常情況(code !=0),因此前端需要對後端返回的通用響應進行統一處理,比如 ...
  • 在Dart學習的第02天,我們通過基礎語法說明和樣例代碼的方式,學習了Dart的16個基礎語法,這些基礎語法給我們後面編寫的Flutter程式打下來堅實基礎。今天,我們繼續深入學習Dart乃至所有編程語言都非常重要的部分:可迭代的集合…… ...
  • 本篇博文圍繞使用Python開發熱門游戲2048 GAME(命令行版本) 代碼未做任何優化(原生且隨意)、全程以面向過程、MVC的設計思想為主、開發環境是Ubuntu系統下的Pycharm 2048是我很久以前學習Python過程中的一個作業,接下來直入正題—— 一、瞭解游戲 1. 介紹 《2048 ...
  • 這是一個FTP(文件傳輸協議)管理工具,能夠支持文件上傳下載以及操作服務端的文件。 該工具由客戶端和服務端組成。客戶端與服務端通過Socket連接實現通信,客戶端發送命令,服務端解析並執行相應的操作。部分代碼已省略,下麵是服務端和客戶端代碼的詳細解釋。 GitHub:https://github.c ...
  • 基於java線上調查問卷系統設計與實現(含配套lun文,ppt),可適用於基於java線上校園調查問卷,基於java校園問卷調查系統,java問卷調查系統,校園線上問卷調查,校園線上調查問卷系統設計,調查問卷管理系統,基於Javaweb實現線上調查問卷系統,網上調查問卷系統,網上問卷調查系統等等; ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...