设计模式使用简例(简单工厂+策略模式+模板方法)

直接上代码,方便记忆。主要的要点,已经写到注释中。

一,代码展示

启动类

package com.rojer;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

controller

package com.rojer.factoryMoudle.controller;import com.rojer.factoryMoudle.PaymentStrategyFactory;
import com.rojer.factoryMoudle.impl.pay.AliPay;
import com.rojer.factoryMoudle.impl.pay.UnionPay;
import com.rojer.factoryMoudle.impl.pay.WechatPay;
import com.rojer.factoryMoudle.impl.pay.abs.AbstractPaymentStrategy;
import com.rojer.factoryMoudle.moudle.PayModule;
import com.rojer.factoryMoudle.impl.pay.inter.PaymentStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/")
public class PayController {@Autowiredprivate PaymentStrategyFactory paymentStrategyFactory;/*** 普通写发法* @param module*/@PostMapping("/online/pay1")public void pay(@RequestBody PayModule module) {PaymentStrategy paymentStrategy;switch (module.getPayType()) {case 1:paymentStrategy = new AliPay();break;case 2:paymentStrategy = new WechatPay();break;case 3:paymentStrategy = new UnionPay();break;default:throw new IllegalArgumentException("无效的支付类型");}paymentStrategy.pay(module.getPayAmount());}/*** 改造后写法* @param module*/@PostMapping("/online/pay2")public void pay2(@RequestBody PayModule module) {AbstractPaymentStrategy strategy = paymentStrategyFactory.getPaymentStrategy(module.getPayType());strategy.commonPay(module.getPayAmount());}}

策略接口

package com.rojer.factoryMoudle.impl.pay.inter;import java.math.BigDecimal;/*** 策略模式接口*/
public interface PaymentStrategy {void pay(BigDecimal amount);
}

策略实现类

阿里支付类

package com.rojer.factoryMoudle.impl.pay;import com.rojer.factoryMoudle.impl.pay.abs.AbstractPaymentStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 具体的策略实现AliPay*/
@Component
public class AliPay extends AbstractPaymentStrategy {// 可注入别的类// @Autowired// private Pay pay;@Overridepublic void pay(BigDecimal amount) {System.out.println("进行了阿里支付");}
}

银联支付类 

package com.rojer.factoryMoudle.impl.pay;import com.rojer.factoryMoudle.impl.pay.abs.AbstractPaymentStrategy;
import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 具体的策略实现UnionPay*/
@Component
public class UnionPay extends AbstractPaymentStrategy {// 可注入别的类// @Autowired// private Pay pay;@Overridepublic void pay(BigDecimal amount) {System.out.println("进行了银联支付");}
}

微信支付类

package com.rojer.factoryMoudle.impl.pay;import com.rojer.factoryMoudle.impl.pay.abs.AbstractPaymentStrategy;
import org.springframework.stereotype.Component;import java.math.BigDecimal;/*** 具体的策略实现WechatPay*/
@Component
public class WechatPay extends AbstractPaymentStrategy {// 可注入别的类// @Autowired// private Pay pay;@Overridepublic void pay(BigDecimal amount) {System.out.println("进行了微信支付");}
}

简单工厂

package com.rojer.factoryMoudle;import com.rojer.factoryMoudle.impl.pay.AliPay;
import com.rojer.factoryMoudle.impl.pay.UnionPay;
import com.rojer.factoryMoudle.impl.pay.WechatPay;
import com.rojer.factoryMoudle.impl.pay.abs.AbstractPaymentStrategy;
import com.rojer.factoryMoudle.moudle.PayEnum;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;/*** 设计模式之简单工厂*/
@Component
public class PaymentStrategyFactory implements ApplicationContextAware {private ApplicationContext applicationContext;/*** 使用简单工厂生成具体的支付对学校** @param payType 支付类型* @return AbstractPaymentStrategy 抽象支付类*/public AbstractPaymentStrategy getPaymentStrategy(Integer payType) {if (PayEnum.ALIPAY.getCode() == payType) {return applicationContext.getBean(AliPay.class);} else if (PayEnum.WECHATPAY.getCode() == payType){return applicationContext.getBean(WechatPay.class);} else if (PayEnum.UNIONPAY.getCode() == payType) {return applicationContext.getBean(UnionPay.class);} else {throw new IllegalArgumentException("无效的支付类型");}}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}
}

模板方法

package com.rojer.factoryMoudle.impl.pay.abs;import com.rojer.factoryMoudle.impl.pay.inter.PaymentStrategy;import java.math.BigDecimal;/*** 设计模式之模板方法* 定义了支付的模板方法*/
public abstract class AbstractPaymentStrategy implements PaymentStrategy {// 模板方法public final void commonPay(BigDecimal amount) {// 检测金额未合法数字check(amount);// 扩展支付pay(amount);// 可以继续扩展模板}// 声明未private,该方法不可被重写,必须按这个进行private void check(BigDecimal amount) {if (amount.compareTo(BigDecimal.ZERO) < 0) {throw new IllegalArgumentException("无效的金额!");}}
}

module类

package com.rojer.factoryMoudle.moudle;public enum PayEnum {ALIPAY(1, "Alipay"),WECHATPAY(2, "WeChat Pay"),UNIONPAY(3, "UnionPay");private final int code;private final String description;PayEnum(int code, String description) {this.code = code;this.description = description;}public int getCode() {return code;}public String getDescription() {return description;}}
package com.rojer.factoryMoudle.moudle;import lombok.Data;import java.math.BigDecimal;@Data
public class PayModule {private Integer payType;private BigDecimal payAmount;
}

二,代码测试

正常值场合

错误值场合

文章学自徐庶老师抖音小课知识讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3223752.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目&#xff1a; 想法&#xff1a; 要找到输入的两个数的最小公倍数&#xff0c;这个最小公倍数要大于等于其中最大的那个数值&#xff0c;遍历最大的那个数值的倍数&#xff0c;最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

读书笔记-Java并发编程的艺术-第4章(Java并发编程基础)-第3节(线程间通信)

文章目录 4.3 线程间通信4.3.1 volatile和synchronized 关键字4.3.2 等待/通知机制4.3.3 等待/通知的经典范式4.3.4 管道输入 / 输出流4.3.5 Thread.join()的使用4.3.6 ThreadLocal的使用 4.3 线程间通信 线程开始运行&#xff0c;拥有自己的栈空间&#xff0c;就如同一个脚本…

斯坦福大学博士在GitHub发布的漫画机器学习小抄,竟斩获129k标星

斯坦福大学数据科学博士Chris Albon在GitHub上发布了一份超火的机器学习漫画小抄&#xff0c;发布仅仅一天就斩获GitHub榜首标星暴涨120k&#xff0c;小编有幸获得了一份并把它翻译成中文版本&#xff0c;今天给大家分享出来&#xff01; 轻松的画风配上让人更容易理解的文字讲…

【深度学习基础】环境搭建 Linux报错bash: conda: command not found...

目录 一、 问题描述二、 解决方法1. 在.bashrc文件中添加环境变量2. 卸载重装anconda 三、总结 一、 问题描述 在linux环境下安装anaconda时候报错&#xff1a;bash: conda: command not found… 二、 解决方法 1. 在.bashrc文件中添加环境变量 参考链接&#xff1a;【解决】…

打开ps提示dll文件丢失如何解决?教你几种靠谱的方法

在日常使用电脑过程中&#xff0c;由于不当操作&#xff0c;dll文件丢失是一种常见现象。当dll文件丢失时&#xff0c;程序将无法正常运行&#xff0c;比如ps&#xff0c;pr等待软件。此时&#xff0c;我们需要对其进行修复以恢复其功能&#xff0c;下面我们一起来了解一下出现…

window.matchMedia

matchMedia() 返回一个新的 MediaQueryList 对象&#xff0c;表示指定的媒体查询字符串解析后的结果。 const width ref(); const myFunction (x) > {if (x.matches) {// 媒体查询document.body.style.backgroundColor "yellow";width.value "yellow&quo…

氛围感视频素材高级感的去哪里找啊?带氛围感的素材网站库分享

亲爱的创作者们&#xff0c;大家好&#xff01;今天我们来聊聊视频创作中至关重要的一点——氛围感。一个好的视频&#xff0c;不仅要有视觉冲击力&#xff0c;还要能够触动观众的情感。那我们应该去哪里寻找这些充满氛围感且高级的视频素材呢&#xff1f;别急&#xff0c;我这…

解答 | http和https的区别,谁更好用

TTP&#xff08;超文本传输协议&#xff09;和HTTPS&#xff08;安全超文本传输协议&#xff09;的主要区别在于安全性和数据传输的方式。 一、区别 1、协议安全性&#xff1a; HTTP&#xff1a;使用明文形式传输数据&#xff0c;不提供数据加密功能&#xff0c;数据在传输过…

数字信号处理教程(3)——z变换

在连续时间域中的每一种分析方法&#xff0c;在离散时间域中想必也能得到对应一种分析方法。连续傅里叶变换对应着离散傅里叶变换&#xff08;DFT&#xff09;&#xff0c;而在拉普拉斯变换则是对应着z变换。z变换能够将信号表示成离散复指数函数的线性组合。连续傅里叶变换可以…

Java如何自定义注解及在SpringBoot中的应用

注解 注解&#xff08;Annotation&#xff09;&#xff0c;也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性&#xff0c;与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面&#xff0c;用来对这些元素进行说…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

Studying-代码随想录训练营day34| 62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树

第34天&#xff0c;动态规划part02&#xff0c;牢记五部曲步骤&#xff0c;编程语言&#xff1a;C 目录 62.不同路径 63.不同路径II 343.整数拆分 96.不同的二叉搜索树 总结 62.不同路径 文档讲解&#xff1a;代码随想录不同路径 视频讲解&#xff1a;手撕不同路径 题目…

接口测试(3)

接口自动化 # 获取图片验证码import requestsresponse requests.get(url"http://kdtx-test.itheima.net/api/captchaImage")print(response.status_code) print(response.text) import requestsurl "http://kdtx-test.itheima.net/api/login" header_da…

爱情和友情触动人心

在这个纷繁复杂的娱乐圈里&#xff0c;爱情与友情的故事总是能触动人心&#xff0c;而“于适前女友包场于适新电影”的新闻&#xff0c;无疑为这个充满故事的舞台又添上了一抹温暖的色彩。这不仅仅是一场电影的包场&#xff0c;更是一段超越常规情感的展现&#xff0c;不禁感叹…

网络安全——防御实验

防御实验一 拓扑结构展示&#xff1a; 一、 根据题目&#xff0c;先为办公区做安全策略主要策略有以下几点&#xff1a; 1、书写名称和描述&#xff0c;名称和描述要明确&#xff0c;让除本人以外的人也能理解 2、确定源地址为办公区&#xff0c;目标地址为DMZ区 3、确定时间…

Xilinx zc706 USB电路解析

作者 QQ群&#xff1a;852283276 微信&#xff1a;arm80x86 微信公众号&#xff1a;青儿创客基地 B站&#xff1a;主页 https://space.bilibili.com/208826118 参考 USB OTG检测原理 USB3320 USB_ID为低电平时候&#xff0c;为host模式&#xff0c;USB_ID为悬空&#xff08;高…

锅总反驳李彦宏说的“不要卷模型,要卷应用”

李彦宏的观点是大家不要卷模型&#xff0c;要卷应用&#xff0c;但我认为这种看法是荒谬的。以下是24条反驳李彦宏观点的论点和论据&#xff1a; 模型的准确性直接决定应用的质量和用户体验&#xff1a; 论据&#xff1a;在自然语言处理、计算机视觉等领域&#xff0c;模型的准…

哦华为仓颉语言

本来我不太想说的&#xff0c;奈何有不少粉丝提问提到了这语言&#xff0c;目前的情况我不透露太多&#xff0c;看过这课程C实现一门计算机编程语言到手撸虚拟机实战的懂的自然懂。 在互联网领域几乎大部分应用软件运行在X86 LINUX上居多&#xff0c;如果你有问题可以先学习这…

C++入门基础(2)

目录 一、引用: 1、定义&#xff1a; 2、特性&#xff1a; 3、引用的使用&#xff1a; 4、const引用&#xff1a;控制权限 const引用定义: const引用可以接收3种对象&#xff1a; 1、正常对象&#xff1a; 2、临时对象&#xff1a; 3、const对象&#xff1a; 总结&…

怎么转播别人的直播

转播别人的直播&#xff0c;特别是实现无缝的实时转播&#xff0c;可以通过一些平台的功能来实现&#xff0c;比如快手和抖音。下面是一个基本的步骤说明&#xff0c;但请注意&#xff0c;具体操作可能会因平台更新或政策变化而有所不同&#xff1a; 找到想要转播的直播间&…