谈谈:你在工作中用到的设计模式!

谈谈:你在工作中用到的设计模式!

Hello大家龙年好!

春节的假期转眼间过去,我们也要回归往日的节奏

因为最近和小伙伴们聊天发现,我们普遍在面试中,对被问起设计模式在工作中的应用,既有点熟悉,又有点陌生,

在网上看吧,又感觉鸡肋(为啥?不能解燃煤之急啊!哈哈),所以,为了打破这一尴尬的窘境,我亲自针对痛点来一篇(若写的不好,尽管喷!哈哈哈)


整体UML

在这里插入图片描述

写之前,我先抛一道面试题,我们一起思考思考!(本篇对已工作或即将如职场的都是不错的巩固与积累,也强烈建议跟着操作一遍,你会有不一样的收获!)

面试官:你在工作中用到过设计模式吗?怎么运用的?(你别好家伙,先想想)

好了,别想了(哈哈哈),我们往下看

嗯,我在工作中用过一些设计模式(若没用过,也不要心虚,俺们按套路来),

  • 我主要用到就是工厂模式,单例模式,策略模式,以及模版,代理模式等(你心里说我平常开发都是if-else啊!别急嘛,我们往下看),

怎么运用的?(我们先说主体的大框架)

  • 嗯~~~我采用的最多的是工厂,策略以及模版方法三种涉及模式的结合(先说使用的哪几种)
  • 我当时在供工作中负责打车软件一个子模块商品链接的支付业务(给出自己工作中的案例)——或者举自己工作中使用if_else多的屎山案例
  • (这步关键)对于此支付服务,对于有微信支付宝以及银行卡等支付方式我是放到策略服务中,
  • 对于公共的逻辑,如支付的前置检查以及支付后的后置处理这块的公共代码我是抽象出来放在模版方法模式中
  • 对这些策略服务管理,何时使用?,我就采用的工厂模式实现的需求

一般说完这些,面试官会感觉,这小伙子工作中学了点东西嘛可以可以!

嘿嘿,你正准备放松一下,这时面试官有往下追问了:能说下具体的细节吗?

你说,这特么我咋知道啊!哈哈哈,我特么也是临时背的啊,没实践过啊!喵的!(打住,别慌,别语无伦次,正所谓,**他有张良计,我有过墙梯嘛!**哈哈哈~)

问到这一步,我们就要根据代码来说了,这段实战代码若初看不怎么会的,我推荐手敲一遍!!!(看看我都敲三个感叹号了啊)

实战案例分析:(案例结合Spring框架实现)

结合上面我们所说的模块案例:支付业务

1.首先:定义一个接口

我们定义一个支付服务,里面包含一个支付方法

/***子模块: 高维炫彩眼镜支付服务
*/
public interface  GlassesPayService{//定义一个支付方法public void pay(GlassesPayRequest glassesPayRequest);
}/***此类定义请求的方法
*/
public class GlassesPayRequest{}

2.定义抽象服务类

这个抽象服务类: 目的是把所有支付渠道中的公共代码抽取出来,(亦是模板方法的体现)

定义整体的支付逻辑

仔细看代码里面的解说!

//实现接口,目的实现pay方法
public  abstract  class  AbstractGlassesPayService  implements  GlassesPayService{//这个里面很重要,pay定义了整体的支付逻辑(也就是我们上面所说的大框架)@Overridepublic void pay(GlassesPayRequest glassesPayRequest){//支付前的检查preCheck(glassesPayRequest);//核心逻辑,抽象再此(For wechat,Alipay....等具体业务实现,留给具体的实现类处理)doPay(glassesPayRequest);//支付后处理postHandle(glassesPayRequest);}//抽象方法,子类需要去实现的public abstract void doPay(GlassesPayRequest glassesPayRequest);private void preCheck(GlassesPayRequest glassesPayRequest){//这里面是支付前的检查,保障支付的安全,防止盗刷...} private void postHandle(GlassesPayRequest glassesPayRequest){//这里面是支付成功后的处理,比如积分啦,还有其他的抽奖等巴拉巴拉...}}

好了,上面的主体我们已经定义完成,我们继续往下敲

3.定义策略服务

这玩意儿我还是比较推荐的,对于有大量的if-else的场景,不管重构还是锻炼自己都是挺爽的

支付宝策略服务
@Service
public  class  GlassesAliPayService  extends AbstractGlassesPayService{//实现方法@Overridepublic void doPay(GlassesPayRequest glassesPayRequest){//AliPay  支付逻辑}
}
微信策略服务
@Service
public  class  GlassesWeCahtPayService  extends AbstractGlassesPayService{//实现方法@Overridepublic void doPay(GlassesPayRequest glassesPayRequest){//WeChat  支付逻辑}
}
央行卡策略服务
@Service
public  class  GlassesBankPayService  extends AbstractGlassesPayService{//实现方法@Overridepublic void doPay(GlassesPayRequest glassesPayRequest){//央行卡  支付逻辑}
}

4.定义工厂

不是东厂也不是西厂,就是特么的工厂,干嘛的? 当然是用来统一管理策略服务的啦!~

我们定义了一个MAP: 用来将所有的用到的策略服务全部注入我们定义的glassessPayServiceMap

当我们需要用的时候,直接调用getGlassesPayService()方法就可以啦!~

@Service
public  class  GlassesPayServiceFactory{@Autowiredpublic Map<String,GlassesPayService> glassessPayServiceMap=new ConcurrentHashMap<>();public GlassesPayService getGlassesPayService(String glassesPayChannel){//eg: AliPay + "PayService" -> AliPayPayServicereturn  glassessPayServiceMap.get(glassesPayChannel+"PayService");}
}

好了,到此我们在Spring框架的基础上,采用模版方法,策略模式,工厂方法模式实现了我们子啊工作一个使用的场景!~

完结撒花!~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

前言 本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布&#xff0c;Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline&#xff0c;可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中&#xff…

centos7 arm服务器编译安装onnxruntime-gpu

前言 ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎,但在arm服务器上,onnxruntime只有CPU版的,GPU版的没有,因此需要自行去编译GPU版本的才可以。 环境准备 1、python3.8 2、cmake:2.26.0版本以上,可以直接下载aarch64版本的进行…

数据库应用:kylin 部署 达梦数据库DM8

目录 一、实验 1.环境 2.部署前规划 3.部署达梦数据库DM8 4.创建数据库及数据库事例管理 5.达梦数据库的基本操作 二、问题 1.xhost命令报错 2.执行安装程序DMInstall.bin 报错 3.解压安装程序报错 4.安装程序找不到文件 5.图像化界面打不开 6.安装内存太小 7.打开…

程序员为什么不喜欢关电脑?没有的事!

程序员为什么不喜欢关电脑&#xff1f; 我干程序员 10 年了&#xff0c;这些年确实不怎么关电脑。不过我感觉这个习惯跟程序员这个职业是无关的&#xff0c;假如我今天不干程序员&#xff0c;我估计也照样不关电脑。其实&#xff0c;我们不妨反过来问&#xff0c;你喜欢关电脑…

BUGKU-WEB bp

题目描述 题目截图如下&#xff1a; 进入场景看看&#xff1a; 解题思路 提示说&#xff1a;弱密码top1000&#xff1f;z???(爆破?)先看看源码有没有提示 相关工具 Burp Suit 爆破top1000字典&#xff0c;点击下载 解题步骤 随便测试账号密码admin、admin 得到提…

五种多目标优化算法(MOJS、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOJS 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

OJ_电子地图

题干 小明是今年参加复试的外校考生&#xff0c;他要去民主楼小礼堂签到。由于对中南大学校本部很不熟悉&#xff0c;小明找到了这边读书的好朋友鲁大师&#xff0c;不巧&#xff0c;鲁大师在忙着自由探索项目的结题工作&#xff0c;不能给他带路&#xff0c;只好给他发了一份…

HarmonyOS 鸿蒙应用开发(十一、面向鸿蒙开发的JavaScript基础)

ArkTS 是HarmonyOS&#xff08;鸿蒙操作系统&#xff09;原生应用开发的首选语言。它是用于构建用户界面的一种TypeScript方言&#xff0c;扩展了TypeScript以适应HarmonyOS生态系统的UI开发需求。ArkTS 融合了TypeScript的静态类型系统和现代UI框架的设计理念&#xff0c;为开…

基于springboot学生就业管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;学生就业管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢&#xff1f;因为系统老升级&#xff0c;老重装&#xff01;&#xff01;也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…

爬虫知识--01

爬虫介绍 # 爬虫的概念&#xff1a; 通过编程技术(python:request,selenium)&#xff0c;获取互联网中的数据(app&#xff0c;小程序&#xff0c;网站)&#xff0c;数据清洗(xpaht&#xff0c;lxml)后存到库中(mysql&#xff0c;redis&#xff0c;文件&#xff0c;excel&#x…

Python算法100例-1.8 冒泡排序

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1.问题描述2.问题分析3.算法设计4.完整的程序5.问题拓展 1&#xff0e;问题描述 对N个整数&#xff08;数据由键盘输入&#xff09;进行升序排列。 2&#xff0e;问题分析 对于N个类型相同的数&#xff0c;…

QT-地形3D

QT-地形3D 一、 演示效果二、关键程序三、下载链接 一、 演示效果 二、关键程序 #include "ShaderProgram.h"namespace t3d::core {void ShaderProgram::init() {initializeOpenGLFunctions();loadShaders(); }void ShaderProgram::addShader(const QString &fil…

2、windows环境下vscode开发c/c++环境配置(一)

前言&#xff1a;VSCode是微软出的一款轻量级编辑器&#xff0c;它本身只是一款文本编辑器而已&#xff0c;并不是一个集成开发环境(IDE)&#xff0c;几乎所有功能都是以插件扩展的形式所存在的。因此&#xff0c;我们想用它编程&#xff0c;不只是把vscode下载下来就行&#x…

面试redis篇-03缓存击穿

原理 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮 解决方案一:互斥锁 解决方案二:逻辑过期 提问与回答 面试官 :什么是缓存击穿 ? 怎么解决 ? 回答: 缓存击穿的意思…

桌面便签怎么设置提醒,哪个备忘录便签好?

2024年终于开工了&#xff0c;第一天上班比较迷茫&#xff0c;不知道做什么比较好&#xff0c;这个时候如果有一款简单好用且可提醒的桌面便签软件该多好。那么&#xff0c;桌面便签怎么设置提醒&#xff0c;哪个备忘录便签好&#xff1f; 桌面便签怎么设置提醒&#xff0c;哪个…

2024-02-19(Flume,DataX)

1.flume中拦截器的作用&#xff1a;个人认为就是修改或者删除事件中的信息&#xff08;处理一下事件&#xff09;。 2.一些拦截器 Host Interceptor&#xff0c;Timestamp Interceptor&#xff0c;Static Interceptor&#xff0c;UUID Interceptor&#xff0c;Search and Rep…

力扣145 二叉树的后序遍历 Java版本

文章目录 题目描述递归解法代码 非递归解法思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出…

NX/UG二次开发—CAM—平面铣边界准确设置方法

大家在对平面铣设置边界时&#xff0c;经常遇到边界方向与自己期望的不一致&#xff0c;有些人喜欢用检查刀路是否过切来判断&#xff0c;但是对于倒角、负余量等一些情况&#xff0c;刀路本来就是过切的。对于多边界&#xff0c;可以根据选择的曲线来起点和面的方向来确定&…