模版模式 设计模式


设计模式 总目录

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.mzph.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; 回溯法 算法设计与…