分享一下设计模式的学习
分享一下设计模式的学习
1、什么是设计模式?
设计模式是在软件设计过程中,经过实践和总结得出的描述、解决软件设计问题的一种经验总结。它是一种被广泛接受和验证的最佳实践,用于解决特定类型的问题,并提供了可重用的解决方案。
设计模式提供了一种在特定情境下构建和组织代码的方式,以解决常见的设计问题。它们是根据软件设计原则和设计思想来定义的,可以帮助软件开发人员更好地理解和解决相似的设计问题。
设计模式的目标是提高软件设计的可复用性、可扩展性和易维护性。它们通过使用已经被验证的解决方案来减少重复的代码编写,并使软件设计更加灵活和可扩展。
设计模式可以分为以下几个类别:
- 创建型模式(Creational Patterns):用于处理对象的创建机制,包括简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和单例模式等。
- 结构型模式(Structural Patterns):用于处理对象之间的组合关系,包括适配器模式、代理模式、装饰器模式、组合模式和享元模式等。
- 行为型模式(Behavioral Patterns):用于处理对象之间的通信和职责分配,包括观察者模式、模板方法模式、策略模式、命令模式和迭代器模式等。
设计模式并不是一种固定的解决方案,而是一种灵活的指导原则。在使用设计模式时,需要根据具体的问题和需求进行选择和适配。设计模式的合理应用可以提高代码的重用性、可读性和可维护性,同时也促进了团队合作和软件开发的规范化。
2、创建型模式
工厂方法模式
它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴漏创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
Spring中的IOC,比如 beanFactory 接口,它有创建对象、配置对象、获取对象的能力,就是一种工厂模式的体现
Spring使用工厂模式编程,写一个工厂,由工厂创建Bean,以后我们如果要对象就直接管工厂要就可以,剩下的事情不归我们管了。Spring IOC容器的工厂中有个静态的Map集合,是为了让工厂符合单例设计模式,即每个对象只生产一次,生产出对象后就存入到Map集合中,保证了实例不会重复影响程序效率。
单例模式
单例模式就是指多次地进行获取对象,实际上是获取的同一对象。
单例模式的实现
- 枚举实现(推荐)
- 静态内部类(推荐)
- 双重锁校验
- 饿汉、懒汉式创建单例
3、结构型模式
代理模式
由代理对象去完成被代理对象的功能,并且可以有自己的扩展,Spring中的AOP
代理模式可以分为 静态代理、动态代理
不过动态代理是在编译器就确定的,比较不灵活。
Spring 中 AOP 的实现,也就是动态代理有两种实现:
JDK Proxy,它要求被代理对象实现了某个接口,它是通过反射动态创建了一个实现目标接口的代理类。
CGLib动态代理是通过继承目标类来实现的代理。它不需要目标类实现接口,而是直接继承目标类,并通过生成子类来进行代理。
CGLib通过生成目标类的子类,并重写父类中的方法来实现代理。子类的方法会拦截父类中的方法调用,并通过代理进行增强或处理。
相比较JDK动态代理,CGLib动态代理在创建代理对象的过程中没有使用反射,这样可以提高创建代理类的速度。在方法调用时,由于直接调用子类的方法,因此性能比JDK动态代理更高。
InvocationHandler、MethodInterceptor
4、行为型模式
模版模式
模板模式是一种行为设计模式,用于定义一个算法的框架,其中的具体步骤由子类实现。模板模式鼓励代码重用和提高可维护性。
在Spring框架中,也广泛使用了模板模式。以下是Spring中一些常见的使用模板模式的例子:
-
JdbcTemplate:JdbcTemplate是Spring提供的用于简化数据库访问的模板类。它定义了一系列操作数据库的模板方法,如查询、更新、执行SQL语句等,通过对这些模板方法的调用,开发者可以更方便地进行数据库操作。而具体的数据库访问细节则由JdbcTemplate的实现类去处理,如配置数据源、执行SQL语句等。
-
HibernateTemplate:类似于JdbcTemplate,HibernateTemplate是用于简化与Hibernate进行数据库交互的模板类。它封装了常用的Hibernate操作,如增删改查等,通过对这些模板方法的调用,可以更方便地进行数据库操作。
-
RestTemplate:RestTemplate是Spring提供的用于在客户端进行HTTP请求的模板类。它封装了HTTP请求的一些常用操作,如发送GET、POST、PUT、DELETE请求等,开发者可以通过调用这些模板方法来简化HTTP请求的编写工作。而具体的请求发送、响应处理等细节由RestTemplate的实现类去处理。
这些是Spring框架中常见的模板类,它们都使用了模板模式,通过定义模板方法来定义算法的框架和执行顺序,具体的步骤由子类或实现类去实现。这样的设计能够提高代码的重用性和可维护性,提供统一的接口进行操作,并将具体的实现细节进行封装,使得应用程序代码更加简洁和易于管理。
RedisTemplate是Spring Data Redis提供的模板类,用于简化与Redis进行交互的操作。它提供了一系列用于操作Redis的模板方法,如读写缓存、执行事务、发布订阅等。
通过RedisTemplate,我们可以方便地进行以下操作:
-
设置和获取键值对数据:RedisTemplate提供了操作字符串类型数据的方法,如
opsForValue().set(key, value)
用于设置键值对,opsForValue().get(key)
用于获取键对应的值。 -
操作Hash类型数据:RedisTemplate提供了操作Hash类型数据的方法,如
opsForHash().put(hashKey, key, value)
用于设置Hash数据,opsForHash().get(hashKey, key)
用于获取指定Hash数据的值。 -
执行事务:RedisTemplate支持事务操作,使用
execute
方法可以在一个事务中执行一系列操作,通过multi()
和exec()
方法来开始和提交事务。 -
发布订阅:RedisTemplate提供了发布和订阅消息的方法,使用
convertAndSend(channel, message)
方法可以向指定的频道发布消息,使用addMessageListener
方法可以添加消息监听器进行订阅。
除了以上的操作,RedisTemplate还提供了其他的操作方法,如操作列表、集合、有序集等。通过使用RedisTemplate,我们可以更方便地进行与Redis的交互,实现缓存、分布式锁、消息队列等功能。
要使用RedisTemplate,需要配置Redis连接池和连接工厂等相关配置,并将RedisTemplate注入到应用程序中。然后,就可以通过调用RedisTemplate的各种方法来操作Redis数据库。
@Autowired
private RedisTemplate<String, Object> redisTemplate;public void setValue(String key, Object value) {redisTemplate.opsForValue().set(key, value);
}public Object getValue(String key) {return redisTemplate.opsForValue().get(key);
}
上面的代码示例展示了使用RedisTemplate来设置和获取键值对数据的操作。通过自动注入RedisTemplate实例,我们可以直接调用opsForValue()方法来操作值类型的数据。
总结起来,RedisTemplate是Spring Data Redis提供的模板类,使用模板模式简化了与Redis交互的操作。通过提供一系列模板方法,开发者可以更方便地进行键值对操作、Hash操作、事务操作、发布订阅等一系列与Redis相关的操作。
未完待续。。。
相关文章:
分享一下设计模式的学习
分享一下设计模式的学习 1、什么是设计模式? 设计模式是在软件设计过程中,经过实践和总结得出的描述、解决软件设计问题的一种经验总结。它是一种被广泛接受和验证的最佳实践,用于解决特定类型的问题,并提供了可重用的解决方案。…...
【JavaEE初阶系列】——CAS
目录 🎈什么是 CAS 📝CAS 伪代码 🎈CAS 是怎么实现的 🎈CAS 有哪些应用 🚩实现原子类 🌈伪代码实现: 🚩实现自旋锁 🌈自旋锁伪代码 🎈CAS 的 ABA 问题 &#…...
webGIS 之 智慧校园案例
1.引入资源创建地图 //index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…...
CVAE——生成0-9数字图像(Pytorch+mnist)
1、简介 CVAE(Conditional Variational Autoencoder,条件变分自编码器)是一种变分自编码器(VAE)的变体,用于生成有条件的数据。在传统的变分自编码器中,生成的数据是完全由潜在变量决定的&…...
【Linux】TCP网络套接字编程+守护进程
文章目录 日志类(完成TCP/UDP套接字常见连接过程中的日志打印)单进程版本的服务器客户端通信多进程版本和多线程版本守护进程化的多线程服务器 日志类(完成TCP/UDP套接字常见连接过程中的日志打印) 为了让我们的代码更规范化&…...
【Qt 学习笔记】Day2 | 认识QtSDK中的重要工具
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Day2 | 认识QtSDK中的重要工具 文章编号:Qt 学习笔记 / 03…...
adc123456
DMA主要用于协助CPU完成数据转运的工作 DMA,英文全称Direct Memory Access,DMA这个外设是可以直接访问STM32内部存储器的,包括运行内存SRAM,程序存储器flash和寄存器等等,DMA都有权限访问,所以DMA能完成数据…...
YOLOV5训练自己的数据集教程(万字整理,实现0-1)
文章目录 一、YOLOV5下载地址 二、版本及配置说明 三、初步测试 四、制作自己的数据集及转txt格式 1、数据集要求 2、下载labelme 3、安装依赖库 4、labelme操作 五、.json转txt、.xml转txt 六、修改配置文件 1、coco128.yaml->ddjc_parameter.yaml 2、yolov5x.…...
精通Go语言文件上传:深入探讨r.FormFile函数的应用与优化
1. 介绍 1.1 概述 在 Web 开发中,文件上传是一项常见的功能需求,用于允许用户向服务器提交文件,如图像、文档、视频等。Go 语言作为一门强大的服务器端编程语言,提供了方便且高效的方式来处理文件上传操作。其中,r.F…...
【C语言】字符串
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符 一维字符数组:存放一个字符串(每个数组元素存放一个字符)二维字符数组:存放多个一维数组(字符串);二维数组的…...
云计算探索-DAS、NAS与SAN存储技术演进及其应用比较
1,介绍 随着信息技术的飞速发展,数据存储的需求日益增长,各种存储技术也应运而生。在众多的存储解决方案中,直接附加存储(Direct Attached Storage,简称DAS)、网络附加存储(Network …...
手机有线投屏到直播姬pc端教程
1 打开哔哩哔哩直播姬客户端并登录(按下图进行操作) 2 手机用usb数据线连接电脑(若跳出安装驱动的弹窗点击确定或允许),usb的连接方式为仅充电(手机差异要求为仅充电),不同品牌手机要求可能不一样,根据实际的来 3 在投屏过程中不要更改usb的连接方式(不然电脑会死机需要重启) …...
SOA、分布式、微服务之间的关系?
分布式它本身就是一种系统部署的架构理念,意思就是将一个系统拆分为各个部分,然后分别部署到不同的机器上去,SOA和微服务项目的部署方式都可以是分布式架构。 而SOA和微服务它们都是面向服务的架构,但是微服务相比于SOA在服务粒度…...
Java多线程学习(概念笔记)
面试题:并行和并发有什么区别? 现在都是多核CPU,在多核CPU下 并发是同一时间应对多件事情的能力,多个线程轮流使用一个或多个CPU 并行是同一时间动手做多件事情的能力,4核CPU同时执行4个线程 面试题:创建线…...
【C++】set和map
set和map就是我们上篇博客说的key模型和keyvalue模型。它们属于是关联式容器,我们之前说过普通容器和容器适配器,这里的关联式容器就是元素之间是有关联的,通过上篇博客的讲解我们也对它们直接的关系有了一定的了解,那么下面我们先…...
yolov5 v7.0打包exe文件,使用C++调用
cd到yolo5文件夹下 pyinstaller -p 当前路径 -i logo图标 detect.py问题汇总 运行detect.exe找不到default.yaml 这个是yolov8里的文件 1 复制权重文件到exe所在目录。 2 根据报错提示的配置文件路径,把default.yaml复制放到相应的路径下。(缺少相应…...
保研线性代数机器学习基础复习2
1.什么是群(Group)? 对于一个集合 G 以及集合上的操作 ,如果G G-> G,那么称(G,)为一个群,并且满足如下性质: 封闭性:结合性:中性…...
vultr ubuntu 服务器远程桌面安装及连接
一. 概述 vultr 上开启一个linux服务器,都是以终端形式给出的,默认不带 ui 桌面的,那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面,然后原程使用呢?至少ubuntu的服务器是有的&am…...
前端学习<二>CSS基础——12-CSS3属性详解:动画详解
前言 本文主要内容: 过渡:transition 2D 转换 transform 3D 转换 transform 动画:animation 过渡:transition transition的中文含义是过渡。过渡是CSS3中具有颠覆性的一个特征,可以实现元素不同状态间的平滑过渡…...
Sqoop 的安装与配置
目录 1 下载并解压2 修改配置文件3 添加环境变量4 拷贝 JDBC 驱动5 测试Sqoop是否能够成功连接数据库 下载地址 1 下载并解压 (1)上传安装包 sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 到 hadoop101 的 /opt/software 路径中 (2…...
Mysql设置访问权限(docker配置)
1.运行命令:docker exec -it 数据库名 bash,我这里是bot_test, docker exec -it bot_test bash 2.运行命令mysql -uroot -p --default-character-setutf8,输入密码连接数据库 3.运行命令show databases,查看当前的表 4.进入my…...
【Linux】详解软硬链接
一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件,要对其建立软链接,做法如下: ln就是link的意思,-s表示软链接,test.txt要建立软链接的文件名,后面跟上要建立的软链接文件名…...
维修贝加莱4PP420.1043-B5触摸屏Power Panel 400工业电脑液晶
深圳捷达工控维修为贝加莱、HMI 显示电源面板 400 4PP420.1043-B5 提供专业电子维修。在 深圳捷达工控维修,我们拥有及时且经济高效地维修 B&R 、HMI Display Power Panel 400 4PP420.1043-B5 的经验。我们为发送给我们工厂维修的贝加莱 HMI 显示面板 400 4PP42…...
Java_21 完成一半题目
完成一半题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种知识点类型。 示例…...
【WPF应用21】WPF 中的 TextBox 控件详解与示例
在 Windows Presentation Foundation (WPF) 中,TextBox 控件是一个强大的输入控件,允许用户输入、编辑和选择文本。TextBox 控件在各种应用程序中都非常常见,例如表单、对话框和编辑器。本文将详细介绍 TextBox 控件的功能、使用方法、属性、…...
小程序页面传参?
小程序页面之间传递参数通常可以通过以下几种方式实现: 通过 URL 参数传递:可以在跳转目标页面时,在 URL 中添加参数,目标页面可以通过 options 参数获取传递过来的数据。 // 页面 A wx.navigateTo({url: targetPage?param1value…...
C++list的模拟实现
为了实现list,我们需要实现三个类 一、List的节点类 template<class T> struct ListNode {ListNode(const T& val T()):_pPre(nullptr),_pNext(nullptr),_val(val){}ListNode<T>* _pPre;ListNode<T>* _pNext;T _val; }; 二、List的迭代器…...
Leetcode 187. 重复的DNA序列
DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如,“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时,识别 DNA 中的重复序列非常有用。 给定一个表示 DNA序列 的字符串 s ,返回所有在 DNA 分子中出现不…...
都江堰泛计算操作系统(多机)应用方向
1、异构多核芯片 DJYOS是全球唯一支持异构多核的操作系统。当前的系统级芯片,为了适应多样化的用户需求,基本上都采用了异构多核架构。传统操作系统就需要在一个芯片内,运行多种操作系统,开发工作更加复杂,运行协同性低…...
【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索—解题全流程(论文更新)
【第十二届“泰迪杯”数据挖掘挑战赛】【2024泰迪杯】B题基于多模态特征融合的图像文本检索更新(论文更新) 本节主要更新了论文、训练日志的log数据提取(Loss、ACC、RK)等数据可视化作图的代码 B题交流QQ群: 4583…...
做的网站错位怎么办/seo优化一般优化哪些方面
在网络安全行业里面,web安全方向的人相对来说算是占大头,因为web安全初学阶段不像系统底层安全那么枯燥,而且成功hack目标网站的成就感相对也是比较强的。 web安全工程师这个职位在甲方和乙方公司都有,在安全这块,甲方…...
刚开始的网站开发公司/网站如何快速收录
hadoop是用Java语言实现的开源软件框架,可以支持多种语言,我学习的时候用得自然就是Java了。 在开始编程之前需要做一些配置工作: Hadoop开发:Hadoop为HDFS和Mapreduce提供了基础的支持,叫hadoop common。Hadoop有一个…...
计算机网站建设相关的书籍/重庆seo整站优化外包服务
出处:http://blog.sina.com.cn/s/blog_7db333fb010132it.html转载于:https://www.cnblogs.com/mq0036/p/4747648.html...
郑州网站推广价格/中国十大seo公司
一天,老板拿了份表格过来,说:把这个数据做个图表出来,更能显示出销量和利润之间的关系,数据如下:绞尽脑汁最后终于做出来了一张图,就像下面这样的。拿给老板看,老板歪着头࿰…...
顺德公司网站制作/广西南宁做网站的公司
在C#里面,属性的get 与 set 非常简单方便。 public class bird {public int age { get;set; } public bool isadult{get {return this.age > 1 ? true:false;}} }而在Python里面,属性可以直接获取或赋值。但是如果在获取或赋值时加一些逻辑判断&am…...
云服务器做网站一般配置/龙岗网站建设
一在搭建开发板前先看一下STC单片机的用户手册。 看完这些应该对该款单片机有所了解,对初次接触单片机的人,可能还是有点云里雾里的感觉,这没关系,很正常。 再看下管脚图: 手册中还提供了最小系统原理图,如…...