- 博客(140)
- 收藏
- 关注
原创 对访问者模式的理解
本文介绍了访问者模式在图形系统中的应用,通过对比未使用和使用访问者模式的代码示例,展示了设计的优缺点。开始时,文章详细描述了图形系统中各种图形对象(如圆形、方形等)的实现方式及其各自方法。这种实现方式适用于初期,但随着业务的发展,系统可能需要增加更多行为(例如计算周长),导致类职责变得复杂,不再具有单一责任原则。为解决这一问题,文章提出采用访问者模式。通过访问者模式,图形对象仅需定义一个接受访客的方法(accept),具体的行为(如绘制图形和计算面积)则由访问者类(ShapeVisitor接口及其实
2025-04-07 23:12:44
593
原创 对解释器模式的理解
本文介绍了如何用解释器模式实现一个简单计算器,以处理仅包含整数、加法操作符+和乘法操作符*的数学表达式。首先给出了解释器模式的应用场景,即小明设计计算器的需求,以及具体的输入输出格式。接着展示了一种不采用解释器模式的实现方法,通过分析代码示例指出这种方法存在的优点。最后,提出了采用解释器模式的解决方案,定义了表达式接口及其实现类来逐步计算结果。整个过程展示了利用解释器模式可以将复杂的语法解析和计算过程进行合理地分离,提高代码的可维护性和扩展性。
2025-04-06 23:47:18
416
原创 对责任链模式的理解
这篇文章讨论了责任链模式在公司请假审批中的应用。小明所在的公司为了处理员工的请假请求,采用了责任链模式。首先介绍了不采用责任链模式时的代码实现,指出了这种方法的缺点:硬编码、多环节耦合等。然后展示了如何通过责任链模式进行改进。责任链模式将每个环节(主管、经理、董事)独立封装成不同的处理者类,每个处理者负责处理一定范围内的请假天数,并且可以将请求传递给下一个处理者。这种方式使得代码更加灵活,可扩展性更强且符合单一职责原则。通过这些内容,文章阐述了责任链模式在提升软件设计质量方面的重要作用。
2025-04-06 22:03:51
905
原创 对状态模式的理解
本文讲述了状态模式的基本概念和应用场景,通过媒体播放器的实例展示不采用状态模式和采用状态模式的对比。首先通过if-else语句实现了播放、暂停、停止功能,并指出了这种方法在遇到新增状态时可能引发代码混乱的问题。接着介绍了状态模式,建议为对象的每种可能状态分别创建类,并实现各个状态下的行为,从而简化代码的修改和维护。在详细的代码示例中将抽象父类定义为MediaPlayerState,并为播放、暂停等状态分别创建具体子类。此外,还演示了如何通过状态类来管理媒体播放器的状态转换。总结而言,状态模式使对象的行为与其
2025-04-05 22:44:39
701
原创 对迭代器模式的理解
本文介绍了一种简化版图书馆书籍管理系统,并展示了在不采用迭代器模式的情况下,如何遍历多个书架上的所有书籍。首先定义了书类`Book`,包含书名属性和一个获取书名的方法。然后定义了书架类`BookShelf`,通过数组存储书籍并提供向书架中添加书的方法和获取具体书籍的方法。接着定义了图书馆类`Library`,其中包含多个书架,并提供向特定书架添加书籍的方法以及遍历所有书架的功能。最后客户端对图书馆进行了初始化,向不同书架添加书籍,并使用嵌套循环遍历所有书架中的书籍并打印书名。这种方式虽然能实现目标,但代码较
2025-04-05 20:49:02
997
原创 对模板方法模式的理解
这篇文章描述了小明设计咖啡制作系统的过程,引入了模板方法模式进行代码优化。在该系统中,小明需要支持两种咖啡类型:美式咖啡(American Coffee)和拿铁(Latte)。文章首先讲述了不采用模板方法模式时,咖啡制作步骤之间的重复冗余。然后进一步引出通过模板方法模式来解决这一问题的思路,即将咖啡制作的相同步骤提取到一个抽象类中,并定义具体子类来覆盖各自不同的步骤,从而实现代码复用、减少冗余。最后,通过Java代码示例具体展现了如何采用模板方法模式重构咖啡制作系统。
2025-04-04 22:31:52
892
原创 对备忘录模式的理解
本文讨论了备忘录模式在设计一个计数器应用中的应用,重点介绍了如何实现增加(Increment)、减少(Decrement)、撤销(Undo)和重做(Redo)操作。在传统面向过程的实现方案中,利用栈记录操作历史,但这种方法使得客户端代码暴露了过多的内部状态。为了解决这个问题,我们引入了备忘录模式,设计了一个Calculator类,用于封装计数器的值和与其相关的操作,这样可以隐藏实际的数据结构,提高代码的封装性和可维护性。通过这篇文章,读者可以理解备忘录模式在实际应用中的意义以及如何使用该模式构建更优雅的代码
2025-04-04 18:05:53
699
原创 结合代码理解Spring AOP的概念(切面、切入点、连接点等)
这篇文章结合代码详细解释了Spring AOP的概念,包括切面、切入点和连接点等。作者首先介绍了一种常见的场景,即在多个方法执行前后要做一些统一的操作,并且提供了一个示例代码,展示如何使用AOP解决这一问题。接着,文章解释了需要将这些代码放在一个类中,并用@Aspect标注这是一个切面类,同时还需用@Component注解让Spring管理这个Bean。然后,通过引入@Pointcut注解定义切入点表达式,告知Spring哪些连接点需要增强。为了更为精准地控制连接点,还可以使用自定义注解来实现。文章最终通过
2025-03-23 22:44:07
739
原创 @Autowired和@Resource的区别是?
@Autowire和@Resource有以下区别:1. **来源不同**: - @Autowired属于Spring框架。 - @Resource是Java的规范(JSR-250),Spring对其进行了支持。2. **查找bean方式不同**: - @Autowired:根据类型查找bean,找到多个则根据名称选择注入。 - 例如:注入时,名称不匹配会报错;可通过@Qualifier指定名称。 - @Resource:先根据名称查找bean,未找到再根据类型查找,
2025-03-15 23:03:32
587
原创 @Autowired 注解在构造器上的使用规则(字段注入也挺好的)
本文探讨了在 Spring Framework 中使用 `@Autowired` 注解给构造器注入依赖的规则。具体来说,Spring Framework 4.3 版本之后,如果目标 Bean 只定义了一个构造器,那么不再需要在构造器上标注 `@Autowired` 注解。然而,如果一个类有多个构造器,并且没有一个被标记为“主要构造器”或默认构造器,则至少需要在一个构造器上注释 `@Autowired`,以便告诉 Spring 容器应该使用哪一个构造器。文章通过代码实例进行了解释,并指出虽然实现中可以使用
2025-03-15 21:27:59
1005
原创 如何高效进行参数校验?(Java Bean Validation)
当Java Bean的字段进行约束的常见注解不够用的时候,我们可以自定义注解来满足诉求。怎么自定义呢?例如:我需要对性别进行校验,已有的注解不满足我的诉求。@Data@Serial@NotBlank(message = "姓名不能为空!")String message() default "性别必须是男或女";Class<?Class<?为啥是这么写的?message好理解,是校验不通过时的提示信息,groups和payload是啥意思?
2025-01-05 21:32:32
788
原创 【刷力扣】23. 合并 K 个升序链表(dummy节点技巧 + 分治思维 + 优先队列)
一棵由k个元素组成的完全二叉树,其树高为logk。没必要一次性将所有node都加入优先队列。我们这里用到的优先队列,本质是。
2024-06-15 22:50:29
827
1
原创 对中介者模式的理解
第一行包括一个整数N,表示用户的数量(1 <= N <= 100) 第二行是N个用户,比如User1 User2 User3,用空格分隔 第三行开始,每行包含两个字符串,表示消息的发出者和消息内容,用空格分隔。小明正在设计一个简单的多人聊天室系统,有多个用户和一个聊天室中介者,用户通过中介者进行聊天,请你帮他完成这个系统的设计。对于每个用户,输出一行,包含该用户收到的所有消息内容。
2024-05-13 22:50:16
922
原创 对策略模式的理解
接下来的 N 行,每行输入两个整数,第一个整数M( 0 < M < 400) 表示商品的价格, 第二个整数表示优惠策略,1表示九折优惠策略,2表示满减优惠策略。小明家的超市推出了不同的购物优惠策略,你可以根据自己的需求选择不同的优惠方式。请你设计一个购物优惠系统,用户输入商品的原价和选择的优惠策略编号,系统输出计算后的价格。输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示需要计算优惠的次数。每行输出一个数字,表示优惠后商品的价格。个人觉得这种方式更灵活。
2024-04-26 22:44:20
1532
原创 对观察者模式的理解
小明所在的学校有一个时钟(主题),每到整点时,它就会通知所有的学生(观察者)当前的时间,请你使用观察者模式实现这个时钟通知系统。发布者状态(数据)变化后,通知订阅者(Subscriber)/观察者。输入的第一行是一个整数 N(1 ≤ N ≤ 20),表示学生的数量。接下来的 N 行,每行包含一个字符串,表示学生的姓名。对于每一次时钟更新,输出每个学生的姓名和当前的时间。主题状态(数据)变化后,通知订阅了该主题的观察者。最后一行是一个整数,表示时钟更新的次数。打开文件 or 保存文件。
2024-04-21 21:35:22
956
原创 对享元模式的理解
享元模式只有一个目的: 减少内存消耗。如果程序没有遇到内存容量不足的问题, 则可以暂时忽略该模式。当然了也有其他称呼:缓存、Cache、Flyweight。我理解:享元,共享元数据。
2024-04-20 21:37:49
476
原创 对组合模式的理解
接下来的 N 行,每行描述一个部门或员工的信息。部门的信息格式为 D 部门名称,员工的信息格式为 E 员工名称,其中 D 或 E 表示部门或员工。请你设计一个组合模式来管理这些部门和员工,实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口,可以获取他们的名称以及展示公司组织结构。第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。小明所在的公司内部有多个部门,每个部门下可能有不同的子部门或者员工。输出公司的组织结构,展示每个部门下的子部门和员工。显然,这并不是正确的实现。
2024-04-20 20:10:24
1424
原创 对桥接模式的理解
实际开发中,我们希望Spring帮我们组织好bean,我们拿来就用即可。装饰器模式,是同一接口(同一抽象)的组合。桥接模式,是不同接口(不同抽象)的组合。
2024-04-16 22:57:23
516
原创 对外观模式的理解
每个设备都有独立的开关密码,分别用数字1、2和3表示。即输入1时,空调关闭,输入2时,台灯关闭,输入3时,电视机关闭,当输入为4时,表示要关闭所有设备。请你使用外观模式编写程序来描述电源总开关的操作。接下来的 N 行,每行包含一个数字,表示对应设备的开关操作(1表示关闭空调,2表示关闭台灯,3表示关闭电视机,4表示关闭所有设备)。输出关闭所有设备后的状态,当输入的数字不在1-4范围内时,输出Invalid device code.第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。
2024-04-15 23:16:57
804
原创 AI来了,Spring还会远吗?(Spring AI初体验)
下载好JDK 17,在上图的JDK中不一定能看到。此时,选add JDK:选。接触过各种llm的api就知道,那叫一个千奇百怪。
2024-04-14 23:04:37
1021
原创 正确使用@RequestMapping(包含属性详解)
服务端报错:Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation]为啥把这个属性放到最后?并不是last but not least,而是这个属性真不重要。默认情况下:请求头的Accept为。
2024-04-14 21:27:43
3162
原创 怎么“访问”Spring容器管理的bean?
一种方式:注入依赖【告知容器,我需要某个bean】正确使用@Resource正确使用@Autowired另一种方式:注入容器,直接“访问”容器中的bean。
2024-04-11 23:14:55
503
原创 正确使用@Autowired
Spring框架两大核心特性:IoC容器(对开发者来说,就是希望Spring帮助注入依赖) + AOP因此,熟练使用Spring框架之一便是熟练使用依赖注入。之前介绍了“正确使用@Resource”,本文重点介绍“正确使用@Autowired”
2024-04-07 20:38:48
2014
原创 对代理模式的理解
在【对AOP的理解】中,提到过代理模式。本篇文章进一步谈谈我对代理模式的理解。@Slf4j@Service@Resource@Override@Resource...UserService是接口,有两个实现类,Spring不知道到底要注入哪个bean,因此报错了。
2024-04-06 23:43:30
703
原创 正确使用@Resource
如果@Resource注解中指定了name属性,那么Spring只会根据name属性的值去找bean,找不到则报错。如果@Resource注解没有指定name属性,那么会根据字段名或setter方法推断一个默认名字。如果根据默认名字找到了bean,那就注入这个bean。如果根据默认名字找不到bean,那就降级为根据类型去找bean。如果还找不到,那就报错。
2024-04-06 21:15:52
1201
原创 Free MyBatis Tool插件的进阶使用指南(消灭dao层的繁琐编码)
目录零、起因一、怎么使用Free MyBatis Tool插件?1 基本使用2 进阶使用(搞清楚Options的用法)2.1 概览2.2 详述2.2.0 Options(一项都不勾选)2.2.1 Use-Lombok【消除UserDO中的getter和setter代码】2.2.2 Comment(实体注释)【和“2.2.1”相比,没任何变化...】2.2.3 Use-Schema(使用Schema前缀)【和“2.2.1”相比,没任何变化...】2.2.4 Overwrite-Java【和“2.2.1”相比,
2024-04-04 21:08:42
1938
原创 让我们一起搞懂:数据库的悲观锁和乐观锁
后端开发少不了操作数据库的表(也就是CRUD boy~)。在多线程环境下,线程A和线程B同时修改同一张表的同一条记录,会导致错误。例如,对于库存Stock表:idquantity1Widget1用户A和用户B几乎同时访问网站,并决定购买"Widget"商品。用户A的请求被线程A处理,线程A读取到"Widget"的库存数量为1。同时,用户B的请求被线程B处理,线程B也读取到"Widget"的库存数量为1。线程A开始处理用户A的购买请求,减少库存数量,即。
2024-03-31 18:07:01
1185
原创 对AOP的理解
跟着廖雪峰老师,实现:对计算方法执行的耗时。@Service@Overridetry {@Aspect@Componenttry {中的xxx和要一一对应。/***/
2024-03-27 22:56:11
1072
原创 如何配置元数据?(如何使用Spring容器)
当然了,本质是@Component这个注解。例如:@Service这个注解也包含@Component。
2024-03-24 17:15:09
1075
原创 对适配器模式的理解
如果fits()方法不变,那么就得将SquarePeg适配成RoundPeg。接口A:RoundHole::fits。数据A:RoundPeg。
2024-03-23 21:23:16
697
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人