- 博客(64)
- 收藏
- 关注
原创 设计模式-桥接模式
这是变化的第二个维度:形状。注意,Shape 类中包含了一个 Color 引用,这就是桥梁。// Abstraction: 形状抽象类// 关键!这就是桥梁,将Shape和Color连接起来// 抽象方法,由子类实现这些是具体的形状,它们继承 Shape 并使用 color 引用来完成自己的功能。// RefinedAbstraction: 圆形// 调用父类构造函数,把“桥”搭好@Override。
2025-06-19 19:27:07
614
原创 设计模式-桥接模式
这是变化的第二个维度:形状。注意,Shape 类中包含了一个 Color 引用,这就是桥梁。// Abstraction: 形状抽象类// 关键!这就是桥梁,将Shape和Color连接起来// 抽象方法,由子类实现这些是具体的形状,它们继承 Shape 并使用 color 引用来完成自己的功能。// RefinedAbstraction: 圆形// 调用父类构造函数,把“桥”搭好@Override。
2025-06-19 19:25:35
669
原创 设计模式-单例模式
定义:单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个唯一的实例。通俗比喻:一个国家只能有一个皇帝或总统。无论你(程序中的任何部分)在何时何地需要和这位最高领导人沟通,你找到的都是同一个人。单例模式就是为了在整个软件系统中创建这位唯一的“皇帝”。核心要点私有化构造函数:为了防止外部通过 new 关键字随意创建实例,必须将构造函数声明为 private。持有静态实例:在类的内部创建一个静态的、属于类本身的实例变量。提供公共静态方法。
2025-06-19 19:25:02
969
原创 设计模式-迭代器模式
第1步:定义 Iterator 和 Aggregate 接口// Iterator 接口E next();// Aggregate 接口第2步:创建具体聚合类 (ConcreteAggregate)// 具体的集合:书架// 当前书的数量last++;// 核心:返回一个为 BookShelf 服务的迭代器实例@Override第3步:创建具体迭代器类 (ConcreteIterator)// 为 BookShelf 服务的具体迭代器。
2025-06-11 20:10:31
1147
原创 设计模式-备忘录模式
想象一下你在玩一个有存档功能的游戏。当你觉得当前进度不错,或者要进行一个有风险的操作前,你会选择“存档”。这个“存档”就保存了你当前游戏的所有状态(比如角色位置、等级、物品栏等)。如果后续操作失败或者你想回到之前的状态,你就可以“读档”,恢复到存档时的状态。
2025-06-10 19:12:31
1273
原创 设计模式-适配器模式
想象一下,你有一个欧标的电器插头(比如两孔圆形),但你家的插座是美标的(比如两孔扁平或三孔)。你不能直接把欧标插头插到美标插座里。这时候你需要一个“转换插头”或“适配器”,这个转换插头一端可以接欧标插头,另一端可以插到美标插座上。
2025-06-10 19:11:58
949
原创 设计模式-状态模式
当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变行为时,通常会在对象内部使用大量的条件语句(if/else 或 switch)。当 Context 对象的状态改变时,它会改变其持有的状态对象的引用。状态模式使得我们可以很容易地添加新的状态(比如 ArchivedState 归档状态)而不需要修改 DocumentContext 类,只需要创建新的状态类并调整状态转换即可。:增加一个新的状态只需要增加一个新的具体状态类,并修改相关的状态转换逻辑,符合开闭原则(对扩展开放,对修改关闭)。
2025-06-09 20:47:33
956
原创 设计模式-抽象工厂模式
定义产品族中每种产品的接口。Java: 通常是 interface。例子:interface Button, interface Checkbox。
2025-06-09 20:47:03
2481
原创 设计模式-观察着模式
观察者模式是一种实现对象间解耦的有效方式,使得当一个对象的状态改变时,能够自动通知依赖于它的其他对象。它在许多应用场景中都非常有用,尤其是在需要事件驱动或数据绑定机制时。理解其核心思想和优缺点,可以帮助你更好地设计和构建灵活、可维护的系统。
2025-06-07 15:17:06
1008
原创 设计模式-建造者模式
建造者模式是一种强大的创建型模式,特别适用于构建具有多个组成部分、配置复杂或有多个可选参数的对象。它通过将构建逻辑与对象表示分离,提高了代码的封装性、可读性和可扩展性。链式调用的变体使得对象的创建过程更加流畅和易于理解。
2025-06-07 15:16:22
733
原创 设计模式-外观模式
客户端只与 Facade 对象交互(直接朋友),而不需要了解 Facade 内部所依赖的子系统(朋友的朋友)。:当需要为子系统增加新的功能时,可能需要修改 Facade 类的源代码,这违反了开闭原则(对扩展开放,对修改关闭)。:Facade 只是提供了一个简化的接口,如果客户端需要更底层的、更灵活的控制,它仍然可以直接访问子系统类(如果子系统类是可见的)。Facade 并不阻止这种直接访问。总而言之,外观模式是一个非常有用的模式,当你想要简化复杂系统的使用,或者隔离变化时,它是一个值得考虑的选择。
2025-06-04 21:30:14
1597
原创 设计模式-迪米特法则
迪米特法则是指导我们设计低耦合、高内聚系统的一个重要原则。它的核心思想是限制对象之间的知识,让每个对象只与它的直接朋友交互。通过封装和委托,我们可以有效地应用迪米特法则,从而创建出更易于维护、扩展和理解的软件系统。但同时也要注意避免过度设计,找到一个合适的平衡点。
2025-06-04 21:29:34
1055
原创 设计模式-装饰模式
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。现在顾客可以要求加牛奶 (Milk)、摩卡 (Mocha)、豆浆 (Soy)、奶泡 (Whip) 等调料。如果需要添加功能,客户端将这个 ConcreteComponent 对象传递给一个 ConcreteDecorator 对象的构造函数,创建一个装饰后的对象。如果被装饰对象的接口很庞大,那么装饰器的实现也会变得复杂。// 通常,getDescription() 在抽象装饰器中可能是抽象的,或者直接委托。
2025-05-28 22:38:31
872
原创 设计模式-开放封闭原则
开放封闭原则是 SOLID 原则中的第二个字母 "O",由伯特兰·迈耶 (Bertrand Meyer) 在其著作《面向对象软件构造》中提出。
2025-05-27 21:31:11
864
原创 设计模式-策略模式
策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端而变化。
2025-05-26 21:03:12
850
原创 设计模式-简单工厂模式
简单工厂模式是一种创建型设计模式,它不属于 GoF(四人帮)的 23 种经典设计模式,但通常被认为是工厂方法模式的一种特殊实现或简化版本。
2025-05-26 21:02:41
2718
原创 TTL和死信交换机实现延迟队列
这使得精确的按消息延迟变得困难。这就是为什么 RabbitMQ 后来推出了 rabbitmq_delayed_message_exchange 插件,它专门用于实现延迟队列,避免了上述 TTL 模拟方式的缺陷,能够精确地按照消息指定的延迟时间进行投递,且消息在延迟期间对消费者不可见。(如 RocketMQ 支持的,或 RabbitMQ 插件提供的) 会更直接和高效地实现“消息在未来某个时间点才可被消费”的需求,并且在延迟期间消息对消费者是不可见的。当你发送一个希望延迟处理的消息时,你将它发送到队列 A。
2025-05-25 21:16:39
536
原创 消息队列的使用
在支付、交易、登录等关键操作发生时,需要实时分析用户行为、交易模式等,快速识别潜在的风险或欺诈行为,并在毫秒级内做出决策(如阻止交易、要求额外验证)。需要在大量数据涌入时,以极低的延迟进行匹配和分析。削峰:生产者的速度非常的高,并发流量非常的大,此时可以增加消费者线程,提高并发处理能力,来达到生产和消费的平衡。解耦:减少依赖,生产者和消费者之间没有直接的依赖,一个系统的故障不会影响另一个系统,保证系统的稳定性和健壮性。填谷:生产的频率降低,流量变小,此时可以减少一些消费者线程,来达到生产和消费的平衡。
2025-05-25 21:15:26
1103
原创 Redis的缓存三兄弟,管道技术,内存淘汰策略以及多种线程模型
在系统对外提供服务之前,就把数据预先加载到Redis中,优化用户的请求不去访问数据库(使用异步线程或者定时job,定时的将数据库中的数据加载到Redis中)对一个key设置了过期时间时,Redis会把该key带上过期时间存储到一个过期字典中,字典保存了数据库中所有key的过期时间。事务提供了一种“将多个命令打包,然后一次性,按顺序地执行”的执行的机制,并且事务在执行的期间不会主动中断。发送的命令数量不会被限制,命令的最大的存储体积为1G,当命令超过限制,命令就不会执行了。
2025-05-19 21:53:26
801
原创 本地缓存的三种实现
当窗口中的条目要进入主区域,或者有新条目要替换主区域中的条目时,Caffeine 会使用 TinyLfu 估算的频率信息来决定是否“录取”这个条目进入主区域,以及淘汰主区域中的哪个条目。这是一种近似的 LFU (Least Frequently Used,最不常用) 算法,它通过一个紧凑的数据结构(如 Count-Min Sketch)来。Caffeine 将缓存分为一个小的“窗口”区域和一个大的“主”区域。Caffeine 使用的缓存淘汰算法比 Guava 的 LRU 更先进、更复杂和高效。
2025-05-13 21:21:26
422
原创 binlog日志以及MySQL的数据同步
给每一个从库,都需要有单独的线程来处理,数据传输多份就要消耗更多的带宽,这会给主库的性能造成很大的压力,不仅不能提升系统性能,反而适得其反,对于生产环境来说,一般都是两到三个从库。:从库会创建一个SQL线程,会读取relay-log中的终极日志,重放binlog,从而更新从库中的数据,其实就是把binlog重新执行了一遍,加载到从库的DB中,完成主从的复制。:MySQL的从库创建的IO线程会连接到主库的binlog,主库会为每一个从库创建一个。中接收到主库的文件,把binlog文件写入到本地的。
2025-05-13 21:20:08
614
原创 Mysql的索引,慢查询和数据库表的设计以及乐观锁和悲观锁
如果查询数据较少,没有超过系统的变量sort_buffer_size时候,则直接在内存中进行排序,是快排,如果超过了变量大小,则会用文件进行排序,也就是归并排序,会导致特别慢,因为涉及到磁盘间文件交换。使用FileSort查询(order by)(排序字段没有加索引, 使用多字段排序,但是排序规则不同)数据表字段都是not null的,即使没有数据,最好也使用无意义的值填充,并在业务代码中特殊处理。不追求严格的数据精简(灵活调整),通过字段冗余来优化查询,减少表关联。触发索引覆盖,不需要回表,速度最优。
2025-05-12 21:06:00
691
原创 Spring的异步
Async需要和@EnableAsync一起使用才有效果。异步任务可以有返回值,也可以没有返回值。常见,常用的Spring内建事件。:事件,事件监听者,事件发布者。事件驱动和消息驱动的区别与联系。最好自定义线程池和异常处理器。
2025-05-12 21:03:34
184
原创 BeanPostProcessor和AOP
编程式事务两种实现:TransactionTemplate,PlatformTransactionManager。对Bean分析,处理,例如记录初始化时间,安全风险检查等。解析Bean的自定义注解,针对注解做一些前置处理。声明式事务:@Transaction;归类Bean,聚合处理过程。底层实现原理:动态代理。
2025-05-10 22:27:20
297
原创 IOC和Bean
这样一来,对象不再需要主动去查找或创建它们的依赖,而是由容器在创建对象时帮助它们完成依赖注入的过程。控制反转的概念主要是与传统的直接构造(即 new 操作)来控制对象依赖的方式相反。
2025-05-10 22:25:30
715
原创 Mysql中索引的知识
核心概念:索引是什么?想象一下你有一本很厚的书,你想找到其中关于某个特定主题的内容。从头到尾翻阅整本书:这就像数据库中的全表扫描 (Full Table Scan)。如果书很长,这个过程会非常慢。查阅书末尾的索引:索引列出了书中的重要词汇或主题,并指明了它们出现在书的哪一页。你只需要快速查找索引(索引本身通常按字母排序),找到你想找的主题,然后直接翻到对应的页码。这就像数据库中的使用索引。在数据库中,索引也是一个类似的数据结构。
2025-04-29 22:13:48
1009
原创 InnoDB对LRU算法的优化
大量的、一次性访问的 Page(如全表扫描带来的)只会被加载到 Old Generation 的头部,它们需要在 Old Generation 中“冷却”一段时间并再次被访问后才有机会晋升到 Young Generation。当执行一个大的全表扫描时,会读取并访问表中所有的 Page。它的时间还没有超过 innodb_old_blocks_time 设定的阈值(默认是 0 毫秒),那么它不会被移动到 Young Generation,仍然留在 Old Generation 的原位。
2025-04-28 21:06:37
1112
原创 大模型应用开发(PAFR)
针对特有业务场景对基础大模型做数据训练和微调,以满足特定场景的需求。:将应用端业务能力与AI大模型推理能力结合,简化复杂业务功能开发。:给大模型外挂一个知识库,让大模型基于知识库内容做推理和回答。将检索结果和用户问题填入Prompt模板。:利用大模型推理能力完成应用的核心功能。用最终获得的Prompt调用LLM。检索知识库中相关知识片段。
2025-04-25 21:10:02
343
原创 docker的基础知识
volumes:volumes:在这里定义了两个卷redis-data和redis-conf,这些卷将由 Docker 管理。它们的具体存储位置将由 Docker 决定,用户无需关心具体路径。这个 Docker Compose 文件定义了一个 Redis 服务,配置了环境变量、端口映射和数据持久化等设置,适合用于开发或测试环境。
2025-04-17 21:59:57
1442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅