問題:通過策略模式+工廠模式+模板方法模式實現ifelse優化

項目場景:

提示:這里簡述項目相關背景:

示例:商城系統有會員系統,不同會員有不同優惠程度,普通會員不優惠;黃金會員打8折;白金會員優惠50元,再打7折;


問題描述

提示:這里描述項目中遇到的問題:

例如:不同會員處理過程中,業務場景復雜,每種會員的業務邏輯很長,不方便維護。

public static double quote(String type) {double score = 1000;double res = 0;if (type.equals("1")) {res = score;} else if (type.equals("2")) {res = score - 50;} else if (type.equals("3")) {res = score * 0.8;} else if (type.equals("4")) {res = (score - 50) * 0.7;}return res;}

原因分析:

提示:這里填寫問題的分析:

業務復雜


解決方案:

在這里插入圖片描述

提示:這里填寫該問題的具體解決方案:

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;public interface PayStrategy {/*** 計算費用** @param price* @date 2025-02-10*/BigDecimal quote(BigDecimal price);
}

具體策略1:非會員,沒有優惠

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;public class OrdinaryStrategy implements PayStrategy{@Overridepublic BigDecimal quote(BigDecimal price) {return price;}
}

具體策略2:黃金會員,打八折

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;
import java.util.Objects;public class GoldStrategy implements PayStrategy{@Overridepublic BigDecimal quote(BigDecimal price) {BigDecimal res = price.multiply(new BigDecimal("0.8"));return res;}
}

具體策略3:白銀會員,先優惠50,后打七折

package com.geekmice.springbootmybatiscrud.strategy.third;import com.geekmice.springbootmybatiscrud.strategy.first.Strategy;import java.math.BigDecimal;public class PlatinumStrategy implements PayStrategy {@Overridepublic BigDecimal quote(BigDecimal price) {BigDecimal res = price.subtract(new BigDecimal("50")).multiply(new BigDecimal("0.7"));return res;}
}

上下文對象:持有一個Strategy的引用

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;/*** @author Administrator*/
public class PayContext {private PayStrategy payStrategy;public void setStrategy(PayStrategy payStrategy) {this.payStrategy = payStrategy;}public BigDecimal getPrice(BigDecimal price) {if (payStrategy != null) {return payStrategy.quote(price);}return null;}
}

測試使用

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {PayContext payContext = new PayContext();OrdinaryStrategy ordinaryStrategy = new OrdinaryStrategy();payContext.setStrategy(ordinaryStrategy);System.out.println("普通會員:"+payContext.getPrice(new BigDecimal("100")));GoldStrategy goldStrategy = new GoldStrategy();payContext.setStrategy(goldStrategy);System.out.println("黃金會員:"+payContext.getPrice(new BigDecimal("100")));PlatinumStrategy platinumStrategy = new PlatinumStrategy();payContext.setStrategy(platinumStrategy);System.out.println("白銀會員:"+payContext.getPrice(new BigDecimal("100")));}
}

結果

普通會員:100
黃金會員:80.0
白銀會員:35.0

優化1:新增其他策略,不影響現有的策略

思路:新增策略類,實現策略接口

package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;public class SilverStrategy implements PayStrategy{@Overridepublic BigDecimal quote(BigDecimal price) {return price.subtract(new BigDecimal("50"));}
}package com.geekmice.springbootmybatiscrud.strategy.third;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {PayContext payContext = new PayContext();OrdinaryStrategy ordinaryStrategy = new OrdinaryStrategy();payContext.setStrategy(ordinaryStrategy);System.out.println("普通會員:"+payContext.getPrice(new BigDecimal("100")));GoldStrategy goldStrategy = new GoldStrategy();payContext.setStrategy(goldStrategy);System.out.println("黃金會員:"+payContext.getPrice(new BigDecimal("100")));PlatinumStrategy platinumStrategy = new PlatinumStrategy();payContext.setStrategy(platinumStrategy);System.out.println("白銀會員:"+payContext.getPrice(new BigDecimal("100")));SilverStrategy silverStrategy = new SilverStrategy();payContext.setStrategy(silverStrategy);System.out.println("白金會員:"+payContext.getPrice(new BigDecimal("100")));}
}

普通會員:100
黃金會員:80.0
白銀會員:35.0
白金會員:50

優化2:策略中出現相同邏輯,如何處理

說明:策略2與策略3處理邏輯中都有需要處理的內容,這個內容可能很長,初始化參數,或者校驗參數,遠程調用獲取數據等操作,都是類似的邏輯,可以抽取到抽象類中,子類需要哪個實現哪個方法,重復的直接在父類操作。

在這里插入圖片描述

策略工廠

package com.geekmice.springbootmybatiscrud.strategy.fifth;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/*** @author mbp* @date 2025-02-11*/
public class StrategyFactory {/*** 設置策略map*/private static Map<String, Strategy> strategyMap = new HashMap<>(16);public static Strategy getStrategyService(String type) {return strategyMap.get(type);}/*** 提前策略裝入 strategyMap*/public static void register(String type, Strategy strategy) {if (Objects.isNull(type)) {return;}strategyMap.put(type, strategy);}
}

策略接口

package com.geekmice.springbootmybatiscrud.strategy.fifth;import org.springframework.beans.factory.InitializingBean;import java.math.BigDecimal;
/*** @author mbp* @date 2025-02-11*/
public interface Strategy extends InitializingBean {BigDecimal quote(BigDecimal price);}

模板方式抽象類

package com.geekmice.springbootmybatiscrud.strategy.fifth;/*** @author mbp* @date 2025-02-11*/
public abstract class BaseMember {/*** 需要父類執行關鍵重復邏輯*/protected void exec(){System.out.println("處理內容");}}

具體策略1

package com.geekmice.springbootmybatiscrud.strategy.fifth;import org.springframework.stereotype.Component;import java.math.BigDecimal;
/*** @author mbp* @date 2025-02-11*/
@Component
public class OrdinaryStrategy extends BaseMember  implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {this.exec();return price;}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("1",this);}
}

具體策略2

package com.geekmice.springbootmybatiscrud.strategy.fifth;import org.springframework.stereotype.Component;import java.math.BigDecimal;
/*** @author mbp* @date 2025-02-11*/
@Component
public class GoldStrategy extends BaseMember implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {BigDecimal res = price.multiply(new BigDecimal("0.8"));this.exec();return res;}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("2", this);}}

具體策略3

package com.geekmice.springbootmybatiscrud.strategy.fifth;import org.springframework.stereotype.Component;import java.math.BigDecimal;
/*** @author mbp* @date 2025-02-11*/
@Component
public class PlatinumStrategy extends BaseMember implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {BigDecimal res = price.subtract(new BigDecimal("50")).multiply(new BigDecimal("0.7"));return res;}@Overridepublic void afterPropertiesSet() throws Exception {StrategyFactory.register("3", this);}
}

測試類

package com.geekmice.springbootmybatiscrud.controller;import com.geekmice.springbootmybatiscrud.dao.StudentMapper;
import com.geekmice.springbootmybatiscrud.pojo.Student;
import com.geekmice.springbootmybatiscrud.strategy.fifth.Strategy;
import com.geekmice.springbootmybatiscrud.strategy.fifth.StrategyFactory;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author Administrator*/
@RestController
@RequestMapping("/student")
public class StudentController {@Resourceprivate StudentMapper studentMapper;@GetMapping(value = "queryAll")public List<Student> queryAll() {Strategy strategyService = StrategyFactory.getStrategyService("1");System.out.println(strategyService.quote(new BigDecimal("1000")));Strategy strategyService2 = StrategyFactory.getStrategyService("2");System.out.println(strategyService2.quote(new BigDecimal("1000")));Strategy strategyService1 = StrategyFactory.getStrategyService("3");System.out.println(strategyService1.quote(new BigDecimal("1000")));return new ArrayList<>();}}

優化3:傳遞策略類型

根據某個策略類型,執行某個策略邏輯

思路:需要保證某個類型對應某個策略類,通過springInitializingBean接口初始化bean,項目啟動過程執行實現InitializingBean接口中的afterPropertiesSet方法,在這個方法中初始化map中指定的策略。

策略接口

public interface Strategy extends InitializingBean {BigDecimal quote(BigDecimal price);
}

策略工廠

package com.geekmice.springbootmybatiscrud.strategy.fourth;import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;public class StrategyFactory {/*** 設置策略map*/private static Map<String, Strategy> strategyMap = new HashMap<>(16);public static Strategy getStrategyService(String type) {return strategyMap.get(type);}/*** 提前策略裝入 strategyMap*/public static void register(String type, Strategy strategy) {if (Objects.isNull(type)) {return;}strategyMap.put(type, strategy);}
}

具體策略1

package com.geekmice.springbootmybatiscrud.strategy.fourth;import com.geekmice.springbootmybatiscrud.strategy.third.PayStrategy;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
@Component
public class OrdinaryStrategy implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {
//        System.out.println("都要處理的內容");return price;}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("11111111111");StrategyFactory.register("1",this);}
}

具體策略2

package com.geekmice.springbootmybatiscrud.strategy.fourth;import com.geekmice.springbootmybatiscrud.strategy.third.PayStrategy;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
@Component
public class GoldStrategy implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {BigDecimal res = price.multiply(new BigDecimal("0.8"));return res;}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("222222222222");StrategyFactory.register("2",this);}
}

具體策略3

package com.geekmice.springbootmybatiscrud.strategy.fourth;import com.geekmice.springbootmybatiscrud.strategy.third.PayStrategy;
import org.springframework.stereotype.Component;import java.math.BigDecimal;
@Component
public class PlatinumStrategy implements Strategy {@Overridepublic BigDecimal quote(BigDecimal price) {// 都要處理的內容// System.out.println("都要處理的內容");BigDecimal res = price.subtract(new BigDecimal("50")).multiply(new BigDecimal("0.7"));return res;}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("3333333333333");StrategyFactory.register("3",this);}}

測試

package com.geekmice.springbootmybatiscrud.controller;import com.geekmice.springbootmybatiscrud.dao.StudentMapper;
import com.geekmice.springbootmybatiscrud.pojo.Student;
import com.geekmice.springbootmybatiscrud.strategy.first.StrategyFactory;
import com.geekmice.springbootmybatiscrud.strategy.fourth.Strategy;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;/*** @author Administrator*/
@RestController
@RequestMapping("/student")
public class StudentController {@Resourceprivate StudentMapper studentMapper;@GetMapping(value = "queryAll")public List<Student> queryAll() {Strategy strategyService =StrategyFactory.getStrategyService("1");System.out.println(strategyService);System.out.println(strategyService.quote(new BigDecimal("1000")));return new ArrayList<>();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895303.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入 JVM 虛擬機:字符串常量池演變與 intern() 方法工作原理解析

?? 作者主頁: 有來技術 ?? 開源項目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template ?? 倉庫主頁: GitCode︱ Gitee ︱ Github ?? 歡迎點贊 ?? 收藏 ?評論 ?? 如有錯誤敬請糾正! 前言 在 Java 開發中,字符串常量池(String Constant…

Android ndk兼容 64bit so報錯

1、報錯logcat如下 2025-01-13 11:34:41.963 4687-4687 DEBUG pid-4687 A #01 pc 00000000000063b8 /system/lib64/liblog.so (__android_log_default_aborter16) (BuildId: 467c2038cdfa767245f9280e657fdb85) 2025…

centos安裝Nexus Repository OSS(Maven私服)

1. 下載鏈接&#xff1a;https://help.sonatype.com/en/download.html 2. 注意頁面下載頁面中的要求&#xff1a;JDK17&#xff08;啟動時提示最低JDK1.8最高JDK17&#xff0c;但是使用JDK1.8無法正常啟動&#xff09; 3. mkdir /opt/nexus 將壓縮包上傳到該目錄并解壓。 tar …

b站——《【強化學習】一小時完全入門》學習筆記及代碼(1-3 多臂老虎機)

問題陳述 我們有兩個多臂老虎機&#xff08;Multi-Armed Bandit&#xff09;&#xff0c;分別稱為左邊的老虎機和右邊的老虎機。每個老虎機的獎勵服從不同的正態分布&#xff1a; 左邊的老虎機&#xff1a;獎勵服從均值為 500&#xff0c;標準差為 50 的正態分布&#xff0c;即…

1.推薦算法基本概念

推薦算法是一個非常重要且廣泛應用的領域&#xff0c;特別是在電子商務、社交媒體、內容推薦等領域。第一課我們將介紹推薦算法的基本概念和分類&#xff0c;并簡單講解兩種常見的推薦算法&#xff1a;協同過濾和基于內容的推薦。 推薦算法的基本概念 推薦系統的目標是根據用…

FFmpeg + OpenGL ES 美顏相機教程大綱

做OpenGL和FFmpeg也有很長一段時間了&#xff0c;最近打算結合FFmpegOpenGL ES做一期視頻教程&#xff0c;下面是完整視頻教程大綱。最終的項目實戰效果是實現一款美顏相機。教程分為理論講解和實戰開發兩部分&#xff0c;適合有一定編程基礎的開發者。課程計劃是免費發布在B站…

Linux:安裝 node 及 nvm node 版本管理工具(ubuntu )

目錄 方法一&#xff1a;手動下載安裝文件安裝方法二&#xff1a;curl安裝 方法一&#xff1a;手動下載安裝文件安裝 git clone 遠程鏡像 git clone https://gitee.com/mirrors/nvm安裝 nvm bash install.sh刷新配置&#xff0c;使配置在終端生效 // 方法 1 source /root/.…

基于STM32的ADS1230驅動例程

自己在練手項目中用到了ADS1230&#xff0c;根據芯片手冊自寫的驅動代碼&#xff0c;已測可用&#xff0c;希望對將要用到ADS1230芯片的人有所幫助。 芯片&#xff1a;STM32系列任意芯片、ADS1230 環境&#xff1a;使用STM32CubeMX配置引腳、KEIL 部分電路&#xff1a; 代碼…

游戲引擎學習第98天

倉庫:https://gitee.com/mrxiao_com/2d_game_2 開始進行一點回顧 今天的目標是繼續實現正常貼圖的操作&#xff0c;盡管目前我們還沒有足夠的光照信息來使其完全有用。昨日完成了正常貼圖相關的基礎工作&#xff0c;接下來將集中精力實現正常貼圖的基本操作&#xff0c;并準備…

Windows 本地部署大模型 OpenWebUI+Ollama

安裝Ollama Ollama官方網址&#xff1a;https://ollama.com 下載運行大模型 在Ollama官網中查看需要下載的大模型 https://ollama.com/library 復制圖片中的鏈接 打開cmd&#xff0c;運行此命令&#xff08;此過程會時間會很久&#xff09; 下載Miniconda Miniconda作用是…

C# 數據驗證Regex

Regular Expression&#xff0c;簡稱 Regex,是一種用于匹配和處理文本的強大工具。它通過定義特定的模式&#xff0c;可以用來搜索、替換或提取字符串中的特定內容。 先引入命名空間 using System.Text.RegularExpressions; Intege(整數) 必須是正整數 //必須是正整數publi…

npm運行Vue項目報錯 error:0308010c:digital envelope routines::unsupported

大家好&#xff0c;我是 程序員碼遞夫。 問題 VSCode 運行Vue項目&#xff0c;提示錯誤&#xff1a; building 2/2 modules 0 activeError: error:0308010c:digital envelope routines::unsupported 解決方法 原因是 npm 高版本(大于17)&#xff0c;對ssl的處理做了改進&…

DeepSeek-R1技術革命:用強化學習重塑大語言模型的推理能力

引言&#xff1a;低成本高性能的AI新范式 在2025年1月&#xff0c;中國AI公司DeepSeek發布了兩個標志性模型——DeepSeek-R1-Zero與DeepSeek-R1&#xff0c;以僅600萬美元的訓練成本實現了與OpenAI O1系列&#xff08;開發成本約5億美元&#xff09;相當的推理性能&#xff0c…

【知識科普】CPU,GPN,NPU知識普及

CPU,GPU,NPU CPU、GPU、NPU 詳解1. CPU&#xff08;中央處理器&#xff09;2. GPU&#xff08;圖形處理器&#xff09;3. NPU&#xff08;神經網絡處理器&#xff09; **三者的核心區別****協同工作示例****總結** CPU、GPU、NPU 詳解 1. CPU&#xff08;中央處理器&#xff0…

安川伺服控制器MP系列優勢特點及行業應用

在工業自動化領域&#xff0c;運動控制器的性能直接決定了設備的精度、效率和可靠性。作為全球領先的運動控制品牌&#xff0c;安川電機伺服控制器憑借其卓越的技術優勢和廣泛的應用場景&#xff0c;正在為智能制造注入強勁動力&#xff01; MP3100&#xff1a;主板型運動控制…

深入探索現代CSS:從基礎到未來趨勢

引言&#xff1a;CSS的進化之路 CSS&#xff08;層疊樣式表&#xff09;自1996年誕生以來&#xff0c;已從簡單的樣式描述語言發展為構建現代Web體驗的核心技術。截至2023年&#xff0c;超過98%的網站使用CSS3技術&#xff0c;其發展歷程見證了Web從靜態文檔到富交互應用的蛻變…

Python----PyQt開發(PyQt高級:圖像顯示,定時器,進度條)

一、圖像顯示 1.1、增加圖標 1.直接創建setWindowIcon(QIcon(燈泡.jpg)) import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtGui import QIconclass MainWindow(QMainWindow):def __init__(self):super(MainWindow, self).__init_…

工業路由器物聯網應用,智慧環保環境數據監測

在智慧環保環境數據監測中工業路由器能連接各類分散的傳感器&#xff0c;實現多源環境數據集中采集&#xff0c;并通過多種通信網絡穩定傳輸至數據中心或云平臺。 工作人員借助工業路由器可遠程監控設備狀態與環境數據&#xff0c;還能遠程配置傳感器參數。遠程控制設置數據閾…

【DeepSeek】在本地計算機上部署DeepSeek-R1大模型實戰(完整版)

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?人工智能與大模型應用 ? ? ? 人工智能&#xff08;AI&#xff09;通過算法模擬人類智能&#xff0c;利用機器學習、深度學習等技術驅動醫療、金融等領域的智能化。大模型是千億參數的深度神經網絡&#xff08;如ChatGPT&…

JAVA并發編程3--多線程程序

? 1.創建線程的方法&#xff1a; 案例&#xff1a;計算1-1000的整數和 實現Runnable接口 步驟&#xff1a; 1.創建一個實現了Runnable接口的類 2.實現類去實現Runnable中的抽象方法&#xff1a;run() 3.創建實現類的對象 4.將此對象作為參數傳遞到Thread類的構造器中&#…