模版模式 設計模式


設計模式 總目錄

https://preparedata.blog.csdn.net/article/details/134512591


文章目錄

    • 設計模式 總目錄
    • 一、案例
    • 二、抽象類模版 AbstractOrderTemplate(頂層的訂單抽象類)
    • 三、執行模版的實現類
      • 3.1 默認執行模版 DefaultOrder
      • 3.2 其他執行模版 SimlpeOrder
    • 四、調用


一、案例

在的下單業務中,可以將下單邏輯拆分,可能存在檢驗參數、獲取商品、 扣減庫存、核銷優惠券、抵扣積分,保存訂單等等。

應為業務的不同,可能下單處理節點不同(扣減庫存、核銷優惠券、抵扣積分,可能需要,可能不需要,也可能相互組合)。這是我們在單一下單接口中,邏輯就比較復雜,需要各種判斷,各種兼容,后續代碼邏輯很難清晰

這是我們可以借助模版模式,將下單邏輯,各個節點拆分,將具體各節點的執行進行模版組合,一個模版對應一套邏輯, 具體的下單邏輯,派發給模版去執行。

1.定義 抽象類 AbstractOrderTemplate 定義聲明拆分下單邏輯, 聲明模版執行; 通過業務類型來獲取模版;

2.定義 實現類 DefaultOrder (默認的執行模版)SimlpeOrder (其他的執行模版)繼承AbstractOrderTemplate, 實現抽象類AbstractOrderTemplate的模版執行。

通過模版可以自由區組合業務節點, 打包成一個執行整體。


二、抽象類模版 AbstractOrderTemplate(頂層的訂單抽象類)

package com.pd.shopping.order.designptern.template;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import java.util.Map;/*** @author hll*/
@Slf4j
@Component
public abstract class AbstractOrderTemplate {public static AbstractOrderTemplate getInstance(String orderType) {switch (orderType){case "Simlpe"://可以利用一些獲取Bean的工具獲取, 避免new//SpringApplicationUtil.getBean(SimlpeOrder.class);return new SimlpeOrder();case "Default":return new DefaultOrder();default:return new DefaultOrder();}}/*** 檢查參數* @param map*/public abstract void check(Map<String, Object> map);/*** 獲取商品* @param map*/public abstract void getGoods(Map<String, Object> map);/*** 扣減庫存* @param map*/public abstract void deductStock(Map<String,Object> map);/*** 扣減積分* @param map*/public abstract void deductPoint(Map<String,Object> map);/*** 保存訂單* @param map*/public abstract void saveOrder(Map<String,Object> map);/*** 執行模版* @param map*/public abstract void executeTemplate(Map<String,Object> map);
}

三、執行模版的實現類

3.1 默認執行模版 DefaultOrder

package com.pd.shopping.order.designptern.template;import java.util.Map;public class DefaultOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//檢查參數check(map);//獲取商品getGoods(map);//扣減庫存deductStock(map);//扣減積分deductPoint(map);//保存訂單saveOrder(map);}
}

3.2 其他執行模版 SimlpeOrder

package com.pd.shopping.order.designptern.template;import java.util.Map;public class SimlpeOrder extends AbstractOrderTemplate {@Overridepublic void check(Map<String, Object> map) {}@Overridepublic void getGoods(Map<String, Object> map) {}@Overridepublic void deductStock(Map<String, Object> map) {}@Overridepublic void deductPoint(Map<String, Object> map) {}@Overridepublic void saveOrder(Map<String, Object> map) {}@Overridepublic void executeTemplate(Map<String, Object> map) {//檢查參數check(map);//獲取商品getGoods(map);//保存訂單saveOrder(map);}
}

四、調用

	@GetMapping("/templateOrder")public void templateOrder() {AbstractOrderTemplate.getInstance("Simlpe").executeTemplate(new HashMap<>());AbstractOrderTemplate.getInstance("Default").executeTemplate(new HashMap<>());}

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

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

相關文章

19.悲觀鎖與樂觀鎖解析

1.悲觀鎖 悲觀鎖比較悲觀&#xff0c;它認為如果不鎖住這個資源&#xff0c;別的線程就會來爭搶&#xff0c;就會造成數據結果錯誤&#xff0c;所以悲觀鎖為了確保結果的正確性&#xff0c;會在每次獲取并修改數據時&#xff0c;都把數據鎖住&#xff0c;讓其他線程無法訪問該…

2023年亞太地區數學建模大賽 問題B

玻璃溫室中的微氣候法規 溫室作物的產量受到各種氣候因素的影響&#xff0c;包括溫度、濕度和風速[1]。其中&#xff0c;適宜的溫度和風速是植物生長[2]的關鍵。為了調節玻璃溫室內的溫度、風速等氣候因素&#xff0c;溫室的設計通常采用帶有溫室風扇的通風系統&#xff0c;如…

docker報錯

安裝 docker報錯&#xff1a; Docker Desktop requires the Server service to be enabled. 解決方法&#xff1a; 管理員身份打開cmd&#xff0c;輸入&#xff1a; services.msc開啟 server 服務。 docker啟動報錯&#xff1a; 打開 docker 界面報錯&#xff1a; Docke…

rabbit MQ的延遲隊列處理模型示例(基于SpringBoot延時插件實現)

rabbitMQ安裝插件rabbitmq-delayed-message-exchange 交換機由此type 表示組件安裝成功 生產者發送消息時設置延遲值 消息在交換機滯納至指定延遲后&#xff0c;進入隊列&#xff0c;被消費者消費。 組件注解類&#xff1a; package com.esint.configs;import org.springfra…

OpenAI再次與Altman談判;ChatGPT Voice正式上線

11月22日&#xff0c;金融時報消息&#xff0c;OpenAI迫于超過700名員工聯名信的壓力&#xff0c;再次啟動了與Sam Altman的談判&#xff0c;希望他回歸董事會。 在Sam確定加入微軟后&#xff0c;OpenAI超700名員工簽署了一封聯名信&#xff0c;要求Sam和Greg Brockman&#x…

Java檢測網絡是否正常通訊

Java是一種流行的編程語言&#xff0c;可以用于開發網絡應用程序。在網絡應用程序中&#xff0c;檢測IP地址和端口是否通常是必要的。本文將介紹如何使用Java檢測IP和端口。 Java檢測IP和端口的方法非常簡單。我們可以使用Java的Socket類來實現。下面的代碼片段演示了如何檢測…

用于 syslog 收集的協議:TCP、UDP、RELP

系統日志是從 Linux/Unix 設備和其他網絡設備&#xff08;如交換機、路由器和防火墻&#xff09;生成的日志 可以通過將 syslog 聚合到稱為 syslog 服務器、syslog 守護程序或 syslogd 的服務器來集中 syslog。在TCP、UDP和RELP協議的幫助下&#xff0c;系統日志從設備傳輸到系…

「快學Docker」監控和日志記錄容器的健康和性能

「快學Docker」監控和日志記錄容器的健康和性能 1. 容器健康狀態監控2. 性能監控3. 日志記錄幾種采集架構圖 4. 監控工具和平臺cAdvisor&#xff08;Container Advisor&#xff09;PrometheusGrafana 5. 自動化運維 1. 容器健康狀態監控 方法1&#xff1a;需要實時監測容器的運…

Zero-Shot Restoration of Back-lit Images Using Deep Internal Learning

ABSTRACT 如何恢復背光圖像仍然是一項具有挑戰性的任務。該領域最先進的方法基于監督學習&#xff0c;因此通常僅限于特定的訓練數據。在本文中&#xff0c;我們提出了一種用于背光圖像恢復的“零樣本”方案&#xff0c;該方案利用深度學習的力量&#xff0c;但不依賴于任何先…

孟德爾隨機化 MR入門基礎-簡明教程-工具變量-暴露

孟德爾隨機化&#xff08;MR&#xff09;入門介紹和分章分享&#xff08;暫時不解讀&#xff09; 大家好&#xff0c;孟德爾隨機化大火&#xff0c;但是什么是孟德爾隨機化&#xff0c;具體怎么實操呢 這沒有其他教程的繁冗&#xff0c;我這篇講最基礎的孟德爾隨機化的核心步…

Selenium瀏覽器自動化測試框架

介紹 Selenium [1] 是一個用于Web應用程序測試的工具。Selenium測試直接運行在瀏覽器中&#xff0c;就像真正的用戶在操作一樣。支持的瀏覽器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff…

STM32_3(GPIO)

GPIO簡介 GPIO&#xff08;General Purpose Input Output&#xff09;通用輸入輸出口8種輸入輸出模式輸出模式可控制端口輸出高電平&#xff0c;驅動LED、蜂鳴器、模擬通信協議輸出時許等輸入模式可讀取端口的高低電平或電壓&#xff0c;用于讀取按鍵輸入、外接模塊電平信號輸…

【VRTK】【VR開發】【Unity】8-可交互對象

【概述】 之前我們只是用了一個簡單方塊作為可交互對象。其實可交互對象可以有許多細節設置,包括具體抓握物體的哪個點,指定抓握的方向,指定Secondary Action允許兩手互換抓握,雙手抓握,用兩手改變物體大小等。 【拾取物體】 要讓一個物體能夠被拾取,必須設置它為可互…

mysql解壓版安裝步驟linux

1. MySQL下載就不說了&#xff0c;以5.7版本舉例 2. 解壓安裝包 tar -zxvf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz 3. 重命名目錄 mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql 4. 創建mysql用戶組和用戶 groupadd mysql useradd -r -g mysql mysql …

十多位老鐵在公司搭建好了測試平臺

保守估計&#xff0c;目前有十多位小伙伴在公司搭建好了。 現在稍微詳細的講一下其中測試計劃的使用說明&#xff1a; &#xff08;圖片有點小&#xff0c;可以點擊擴大查看&#xff09; 1、進入測試計劃模塊&#xff0c;點擊“添加”&#xff0c;如下圖5.1&#xff1a; ▲圖 5…

NX二次開發UF_CAM_set_cam_preferences 函數介紹

文章作者&#xff1a;里海 來源網站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_cam_preferences Defined in: uf_cam.h int UF_CAM_set_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function sets the current settings of…

PTA-6-44 水果接口-工廠設計模式

用工廠設計模式編寫程序代碼。已知有如下Fruit接口&#xff0c;請編寫其子類Apple類與Orange類&#xff0c;另外再編寫一個Factory工廠類&#xff0c;具體要求如下。 需要編寫Fruit接口的子類&#xff1a; 兩個子類Apple和Orange&#xff0c;實現接口Fruit&#xff0c;并覆寫ea…

若依框架導出下載pdf/excel以及導入打印等

一、打印文件 // 報表打印 handlePdf(row) {wayAPI(row.billcode).then((res) > {var binaryData [];binaryData.push(res);let url window.URL.createObjectURL(new Blob(binaryData, {type: "application/pdf"})); window.open("/static/pdf/web/v…

【鴻蒙應用ArkTS開發系列】- 云開發入門實戰二 實現城市多級聯動Demo(上)

目錄 概述 云數據庫開發 一、創建云數據庫的對象類型。 二、預置數據&#xff08;為對象類型添加數據條目&#xff09;。 三、部署云數據庫 云函數實現業務邏輯 一、創建云函數 二、云函數目錄講解 三、創建resources目錄 四、獲取云端憑據 五、導出之前創建的元數據…

算法設計與分析復習

分支法 算法設計與分析復習–遞歸與分治(一) 算法設計與分析復習–遞歸與分治&#xff08;二&#xff09; 動態規劃 算法設計與分析復習–動態規劃 貪心 算法設計與分析復習–貪心&#xff08;一) 算法設計與分析復習–貪心&#xff08;二&#xff09; 回溯法 算法設計與…