- 博客(104)
- 收藏
- 关注
原创 算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
蒙特卡洛算法以其独特的随机抽样思想,为解决复杂数学问题和工程应用提供了灵活高效的方法。本文从算法的基本概念、思想出发,详细讲解了解题思路,通过圆周率估算、定积分计算和随机数生成等案例展示了算法的实际应用,并结合考研 408 的考点进行了分析。在学习过程中,需重点理解蒙特卡洛算法的随机性和概率性本质,掌握 “通过大量试验逼近真实解” 的核心思路,并能根据问题需求权衡精度与计算成本。对于考研 408 考生,需关注算法的分类、复杂度分析及典型应用,理解其与确定性算法的差异。
2025-07-11 10:42:24
509
原创 算法学习笔记:16.哈希算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
摘要: 哈希算法通过哈希函数将任意输入映射为固定长度的哈希值,具有确定性、高效性和抗碰撞性等特点。其核心思想是通过快速定位实现高效数据操作,在哈希表中应用广泛(如链地址法、开放定址法)。密码学哈希(如SHA-256)则强调不可逆性和安全性。LeetCode实战中,哈希表常用于两数之和、去重等场景,时间复杂度接近O(1)。考研408重点考察哈希表构造、碰撞处理(线性探测、链地址法)及性能分析(负载因子影响)。哈希算法在数据存储、校验及密码学中至关重要,需结合场景灵活选择实现方案。
2025-07-11 09:18:27
661
原创 算法学习笔记:15.二分查找 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
二分查找是一种高效的有序数据查找算法,通过不断将查找范围减半,将时间复杂度降至O(logn)。本文系统讲解了二分查找的核心原理、算法实现步骤(包括边界处理)、LeetCode典型例题(704、34、33题)的Java代码实现,并分析了其在考研408中的核心考点:时间复杂度计算、适用条件、递归/迭代实现对比以及常见错误。重点强调了有序性前提、边界条件处理技巧和不同场景的变体应用,为算法学习和考试备考提供了全面指导。
2025-07-10 08:15:00
940
原创 算法学习笔记:14.线性查找——从原理到实战,涵盖 LeetCode 与考研 408 例题
线性查找(顺序查找)是最基础的查找算法,通过逐个比较元素实现查找。其核心思想是从数据结构首元素开始遍历,直到找到目标值或遍历完成。适用于数组、链表等线性结构,时间复杂度为O(n),空间复杂度O(1)。本文结合LeetCode例题(数组查找、字符串匹配等)展示Java实现,并分析考研408考点:算法原理、复杂度分析、适用场景及与二分查找的对比。线性查找虽效率不高,但实现简单、无需数据预处理,是学习更复杂算法的基础。掌握其原理对编程入门和考研备考都至关重要。
2025-07-10 08:00:00
655
原创 算法学习笔记:12.快速排序 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
快速排序是一种高效的分治排序算法,平均时间复杂度O(nlogn),通过选择基准元素将数组分为两个子数组递归排序。其核心是分区操作,常用Lomuto分区法。优化策略包括随机选择基准和三数取中法,避免最坏情况O(n²)。LeetCode例题(如912排序数组和215第K大元素)展示了实际应用。考研408常考时间复杂度分析、与其他排序算法对比等。快速排序适合处理大规模随机数据,但不稳定且对有序数组敏感,需根据场景选择合适的基准策略。
2025-07-09 08:00:00
2626
10
原创 算法学习笔记:13.归并排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
归并排序是一种基于分治策略的稳定排序算法,时间复杂度稳定为O(nlogn)。其核心思想是将数组不断二分至单个元素后合并,合并过程借助辅助数组实现排序。相较于快速排序,归并排序更适合处理大规模数据和链表结构。本文通过图解和Java代码详细解析了归并排序的实现过程,并应用于LeetCode例题(如912题数组排序和315题逆序对统计)及考研408真题(链表排序和概念辨析),展现其在实际问题中的高效应用,特别强调了其在稳定性要求和并行处理方面的优势。
2025-07-09 08:00:00
923
原创 算法学习笔记:11.冒泡排序——从原理到实战,涵盖 LeetCode 与考研 408 例题
本文详细介绍了冒泡排序算法,从基本原理到实际应用。冒泡排序通过相邻元素比较交换,使较大元素逐渐"下沉",时间复杂度为O(n²),最坏情况下需n-1轮排序。文章分析了算法的稳定性、原地性等特性,对比了与其他排序算法的差异,并提供了LeetCode例题的Java实现(如912题数组排序和164题最大间距)。针对考研408考点,重点讲解了时间复杂度分析、优化方法(如标志变量)等内容。虽效率不高,但冒泡排序仍是理解排序思想的经典入门案例,适合算法学习和考研备考。
2025-07-08 11:00:21
810
原创 算法学习笔记:10.Prim 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Prim算法是一种用于求解最小生成树的经典贪心算法,主要应用于网络设计、电路布线等领域。其核心思想是从初始顶点出发,逐步选择连接"已选顶点集"与"未选顶点集"的最小权值边来扩展生成树。本文详细介绍了Prim算法的基本概念、执行流程、解题思路,并通过LeetCode例题(如1584题)展示了Java实现代码。文章还分析了Prim算法与Kruskal算法的区别,以及在考研408中的常见考点,包括算法原理、时间复杂度分析和正确性证明。该算法适用于稠密图,时间复杂度为n²
2025-07-08 10:38:31
1129
原创 算法学习笔记:9.Kruskal 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Kruskal算法深度解析:最小生成树经典解法 Kruskal算法是求解最小生成树的经典贪心算法,通过排序边集合并利用并查集检测环来构建最小树。本文系统讲解了算法原理:从图的定义、生成树概念到算法思想的贪心策略实现过程。结合LeetCode例题(如1135和332题),展示了代码实现方法,重点分析了并查集的使用技巧。针对考研408需求,文章对比了Kruskal与Prim算法的性能差异,指出Kruskal更适合稀疏图,时间复杂度为O(ElogE)。备考建议强调通过实践掌握算法变形应用能力,建立完整知识体系。
2025-07-07 17:46:41
1408
原创 算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Bellman-Ford算法是处理带负权边单源最短路径问题的经典算法。本文系统介绍了该算法的基本原理、松弛操作核心思想以及|V|-1次迭代的关键步骤,并详细说明了负权回路的检测方法。通过LeetCode例题(787、1345)展示了算法在解决特定问题时的实际应用与代码实现(Java)。同时,针对考研408需求,分析了该算法的考察重点,包括时间复杂度分析(O(|V|×|E|))、与其他最短路径算法的对比等。文章强调掌握Bellman-Ford算法对算法竞赛、工程实践和考研备考的重要价值。(150字)
2025-07-07 16:40:53
709
原创 算法学习笔记:7.Dijkstra 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
Dijkstra算法是求解单源最短路径问题的经典算法,由荷兰计算机科学家Edsger W. Dijkstra于1956年提出。该算法采用贪心策略,通过维护已确定和未确定最短路径的节点集合,逐步计算从源点到其他所有节点的最短路径距离。文章详细介绍了算法的基本概念、执行步骤和解题思路,并结合LeetCode例题(网络延迟时间和解救人质)展示了Java代码实现。此外,还分析了该算法在计算机考研408中的考点,包括图的存储结构、贪心算法思想、正确性证明以及算法变形应用等。Dijkstra算法在路径规划、网络路由等领
2025-07-04 16:16:44
1115
原创 算法学习笔记:6.深度优先搜索算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
深度优先搜索(DFS)是一种基于递归或栈实现的搜索算法,广泛应用于图论、回溯、拓扑排序等领域。其核心思想是沿着路径尽可能深入探索,直到无法继续再回溯。DFS可通过递归(简洁但有栈溢出风险)或迭代(使用栈结构)实现,适用于岛屿数量计算、单词搜索等LeetCode题目及考研算法题。典型应用包括判断无向图回路、网格遍历等问题。该算法通过标记访问节点和回溯机制高效解决问题,是计算机科学中的重要基础算法。
2025-07-04 15:41:35
939
原创 算法学习笔记:5.后缀数组——从原理到实战,涵盖 LeetCode 与考研 408 例题
摘要: 后缀数组是字符串处理的重要工具,通过字典序排序所有后缀构建而成,适用于最长公共前缀、字符串匹配等问题。本文详解倍增算法构建后缀数组的过程,结合排名数组和高度数组提升效率,并通过LeetCode例题(如1163、187)展示Java实现。此外,后缀数组与考研408的数据结构、排序算法、分治思想等核心知识点紧密相关,有助于深化算法理解与应试能力。通过理论解析与实战结合,本文为算法学习者和考研生提供系统指导,建议辅以练习巩固掌握。
2025-07-03 18:44:09
569
原创 算法学习笔记:4.KMP 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
KMP算法是高效的字符串匹配算法,通过构建部分匹配表(next数组)避免重复比较。本文详解其核心思路:首先构建模式串的最长前缀后缀表,匹配时利用该表优化回溯过程。通过LeetCode例题(如28题字符串匹配、459题重复子串)和考研408案例分析,展示KMP算法的具体应用。文章提供Java代码实现,包括next表构建和匹配流程,强调该算法在减少时间复杂度(O(n+m))上的优势。掌握KMP算法对解决字符串匹配问题及计算机专业考试具有重要意义。
2025-07-03 11:40:44
1172
原创 算法学习笔记:3.广度优先搜索 (BFS)——二叉树的层序遍历
广度优先搜索(BFS)是一种逐层遍历的算法,常用于查找最短路径和层级遍历。其核心思想是通过队列实现从起点开始,逐层向外扩展搜索,确保先访问距离起点近的节点。BFS与DFS不同,前者像地毯式搜索适合找最短路径,后者则深度优先。以二叉树层序遍历为例,BFS通过队列存储节点,每次取出当前层所有节点,将其子节点加入队列,最终按层次返回节点值集合。代码实现中,使用队列存储待访问节点,循环取出并处理当前层节点,同时将下一层节点入队,形成层次遍历效果。
2025-06-13 20:00:00
449
原创 算法学习笔记:2.大根堆算法——数据流的中位数or最后一块石头的重量
两题均采用堆结构解题。1046题使用大根堆处理石头重量问题,每次取出最大两块石头相减,差值重新入堆,直至剩余0或1块。295题实现动态数据流的中位数查找,通过大小根堆配合:大根堆存较小半部分,小根堆存较大半部分。插入时根据总数奇偶性调整堆结构,奇数时大根堆多1元素,偶数时两堆平衡,中位数取堆顶或平均值。时间复杂度均为O(logN),空间复杂度O(N)。堆结构有效简化了动态数据的排序与查询过程
2025-06-12 22:00:00
1049
原创 算法学习笔记:1.摩尔投票算法——多数元素(Moore‘s Voting Algorithm)
摩尔投票算法是一种用于在数组中寻找多数元素的有效方法。所谓的多数元素就是在数组中出现次数超过一半以上的元素。所以经常用于众数的查找
2025-03-01 15:52:22
592
1
原创 DeepSeek 结合 IDEA!辅助编程太强了!
对于 Java 开发者而言,将 DeepSeek 集成到 IDEA 中,就如同为自己的编程之路配备了一位智能助手,大幅提升开发效率,让编程变得更加轻松愉悦。重复上述的设置操作,在IDEA中找到已经安装的插件 CodeGpt 工具的设置,然后依次找到 Custom OpenAI 的设置。这里有三部分需要配置,高版本的 IDEA 不仅在功能上更加完善,而且在与 DeepSeek 的兼容性和稳定性方面也有更好的表现,能够为后续的集成工作提供坚实的基础。通过上述步骤,即可配置完成,配置完成后,点击应用和确认即可。
2025-02-07 18:01:28
2187
2
原创 Redis不同类型使用操作方法一文流(超级干货附带源码)
将StringRedisTemplate引用到对应工具类对应的工具类源文件已经上传。
2024-10-24 10:54:03
740
2
原创 【设计模式】JAVA Design Patterns——State(状态模式)
State(状态)模式是一种对象行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。State模式的核心思想是将对象的行为封装在不同的状态对象中,并且使得对象在不同状态下可以切换。状态模式是一种允许对象在内部状态改变时改变它的行为的行为型设计模式。状态模式可以被理解为策略模式,它能够通过调用在模式接口中定义的方法来切换策略。当在长毛象的自然栖息地观察长毛象时,似乎它会根据情况来改变自己的行为。允许对象在内部状态改变时改变它的行为。对象看起来好像修改了它的类。状态模式允许对象改变它的行为。
2024-06-08 08:54:55
1045
9
原创 【设计模式】JAVA Design Patterns——Servant(服务模式)
在软件工程中,仆人模式定义了一个对象,用于向一组类提供某些功能,而无需在每个类中定义该功能。仆人是一个类,其实例(甚至只是类)提供了处理所需服务的方法,而仆人为其(或与谁)做某事的对象被视为参数。Servant(仆人)模式,也称为Active Object 模式,是一种并发设计模式,用于提供并发对象之间的服务。仆人类被用于向一组类提供一些行为,区别于在每个类定义行为-或者当我们无法排除。皇家是一个接口,它被国王和女王类实现,以获取仆人的服务。确保一个仆人对象为一组被服务的对象提供一些特定的服务。
2024-06-07 09:30:00
693
3
原创 【设计模式】JAVA Design Patterns——Proxy(代理模式)
在最一般的形式上,代理是一个类,它充当与其他对象的接口。代理是客户端调用的包装器或代理对象,以访问后台的实际服务对象。在代理中,可以提供额外的功能,例如在对实对象的操作占用大量资源时进行缓存,或者在对实对象的操作被调用之前检查前提条件。想象有一个塔,当地的巫师去那里学习他们的法术。这里的代理就代表的塔的功能并添加访问控制。代理适用于需要比简单指针更广泛或更复杂的对象引用的情况。为另一个对象提供代理或占位符以控制对其的访问。使用代理模式,一个类代表另一个类的功能。创建一个简单的巫师类。然后这是进入塔的场景。
2024-06-06 09:30:00
1209
4
原创 【设计模式】JAVA Design Patterns——Private Class Data(私有类数据设计模式)
私有类数据设计模式试图通过限制属性的可见性来减少属性的暴露。通过将它们封装在单个Data对象中,可以减少类属性的数量。你想阻止家庭成员在你烹饪时偷偷品尝菜品,否则后面可能东西不够吃了。私有类数据模式通过将数据与使用它的方法分离到维护数据状态的类中,从而防止了对不可变数据的操纵。类 ,它的属性没有被私有类数据保护,从而使炖菜的成分对类方法易变。私有类数据是计算机编程中的一种设计模式,用于封装类属性及其操作。根据上面炖汤的例子。现在,其中的方法无法处理。在以下情况下使用私有类数据模式。创建每个类并调用其方法。
2024-06-05 09:30:00
434
4
原创 【设计模式】JAVA Design Patterns——Observer(观察者模式)
consumer想要消费kafka broker中的数据需要发送request,request发送的结果用RequestFuture来表示,RequestFuture中包含RequestFutureListener,当request处理完成后RequestFutureListener的相关方法会被调用。观察者模式是这样的一种软件设计模式:它有一个被称为主题的对象,维护着一个所有依赖于它的依赖者清单,也就是观察者清单,当主题的状态发生改变时,主题通常会调用观察者的方法来自动通知观察者们。
2024-06-04 10:12:06
1065
32
原创 【设计模式】JAVA Design Patterns——Monitor(监视器模式)
当您有代码的关键部分一次只需要由一个线程执行时。在并发编程(也称为并行编程)中,监视器是一种同步构造,它允许线程具有互斥性和等待(阻止)特定条件变为假的能力。:当您的应用程序涉及需要由多个线程访问和更新的共享数据结构、变量或资源时。主要目的是为多个线程或进程提供一种结构化和受控的方式来安全地访问和操作共享资源,例如变量、数据结构或代码的关键部分,而不会导致冲突或竞争条件。在应用监视器模式之前,建议彻底分析应用程序的并发需求,并选择最适合您需求的同步方法,同时考虑性能、复杂性和可用语言功能等因素。
2024-06-03 10:49:17
1383
9
原创 【设计模式】JAVA Design Patterns——Iterator(迭代器模式)
百宝箱包含一组魔法物品。有多种物品,例如戒指,药水和武器。可以使用藏宝箱提供的迭代器按类型浏览商品。在面向对象的编程中,迭代器模式是一种设计模式,其中迭代器用于遍历容器并访问容器的元素。提供一种在不暴露其基础表示的情况下顺序访问聚合对象的元素的方法。容器可以提供与表示形式无关的迭代器接口,以提供对元素的访问。遍历在宝箱中找到的戒指类型物品。创建含物品的藏宝箱是主要类。以下情况使用迭代器模式。
2024-06-01 10:34:53
781
14
原创 【设计模式】JAVA Design Patterns——Factory Method(虚拟构造器模式)
在基于类的编程中,工厂方法模式是一种创建型设计模式用来解决创建对象的问题,而不需要指定将要创建对象的确切类。这是通过调用工厂方法创建对象来完成的,而不是通过调用构造器。该工厂方法在接口中指定并由子类实现,或者在基类实现并可以选择由子类重写。为创建一个对象定义一个接口,但是让子类决定实例化哪个类。精灵需要精灵武器,而兽人需要兽人武器。现在随着客户的到来,会召唤出正确类型的铁匠并制造出要求的武器。它为类提供了一种把实例化的逻辑委托给子类的方式。以上面的铁匠为例,创建铁匠的接口和一些它的实现。
2024-05-31 09:41:12
683
5
原创 【设计模式】JAVA Design Patterns——Facade(外观模式)
Facade模式通常涉及一个名为Facade的单一类,该类提供了一个高级接口,用于与客户端交互,并将客户端的请求委派给系统内部的一组相关对象。这是你所相信的因为你在使用一个金矿对外提供的一个简单接口,在内部它要却要做很多事情。这个简单的接口对复杂的子系统来说就是一个外观。为一个子系统中的一系列接口提供一个统一的接口。外观定义了一个更高级别的接口以便子系统更容易使用。外观是为很大体量的代码(比如类库)提供简单接口的一种对象。使用上面金矿的例子。外观模式为一个复杂的子系统提供一个简单的接口。
2024-05-30 13:23:58
740
4
原创 【设计模式】JAVA Design Patterns——Dependency Injection(依赖注入模式)
依赖注入是一种软件设计模式,其中一个或多个依赖项(或服务)被注入或通过引用传递到一个依赖对象(或客户端)中,并成为客户端状态的一部分。可测试性:依赖注入允许将依赖项注入到组件中,这样在单元测试时可以轻松地替换真实的依赖项为模拟对象或者桩对象。改变行为:通过依赖注入,可以更容易地改变组件的行为,例如切换实现、调整配置等,而无需修改组件本身的代码。解耦配置和实现:依赖注入允许将组件的配置信息与其实现分离,这样可以更容易地管理和调整配置,并且可以减少重复的代码。依赖注入将客户端依赖的创建与其自身行为分开。
2024-05-29 09:28:55
1770
33
原创 【设计模式】JAVA Design Patterns——Decorator(装饰器模式)
在面向对象的编程中,装饰器模式是一种设计模式,它允许将行为静态或动态地添加到单个对象中,而不会影响同一类中其他对象的行为。装饰器模式通常对于遵守单一责任原则很有用,因为它允许将功能划分到具有唯一关注领域的类之间。附近的山丘上住着一个愤怒的巨魔之王。通常它是徒手的,但有时它有武器。为了武装巨魔不必创建新的巨魔,而是用合适的武器动态的装饰它。装饰者模式让你可以在运行时通过把对象包装进一个装饰类对象中来动态的改变一个对象的行为。动态的为对象附加额外的职责。接下来为巨魔之王添加棒球棒,可以使用装饰者来动态实现。
2024-05-28 09:30:05
853
8
原创 【设计模式】JAVA Design Patterns——Data Transfer Object(数据传递对象模式)
在编程领域,数据传输对象(DTO)是在进程之间承载数据的对象。使用它的动机是,通常依靠远程接口(例如Web服务)来完成进程之间的通信,在这种情况下,每个调用都是昂贵的操作。因为每个(方法)调用的大部分成本与客户端和服务器之间的往返时间有关,所以减少调用数量的一种方法是使用一个对象(DTO)来聚合将要在多次调用间传输的数据,但仅由一个调用提供。我们不使用一次查询一个属性,而是使用DTO一次传送所有相关属性。次将具有多个属性的数据从客户端传递到服务器,以避免多次调用远程服务器。类充当客户信息的服务器。
2024-05-28 09:16:07
521
原创 【设计模式】JAVA Design Patterns——Data Access Object(数据访问对象模式)
在计算机软件中,数据访问对象(DAO)是一种模式,可为某种类型的数据库或其他持久性机制提供抽象接口。有一组客户数据需要持久化到数据库中。我们需要整个额外的增删改查操作以便操作客户数据。对象为某种类型的数据库或其他持久性机制提供了抽象接口。DAO是我们通过基本持久性机制提供的接口。接口及其两个不同的实现。
2024-05-27 09:45:04
570
5
原创 【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
奇异递归模板模式(curiously recurring template pattern,CRTP)是C++模板编程时的一种惯用法:其中类X派生自使用X本身作为模板参数的类模板实例化。对于正在策划赛事的综合格斗推广活动来说,确保在相同重量级的运动员之间组织比赛至关重要。这样可以防止体型明显不同的拳手之间的不匹配,例如重量级拳手与雏量级拳手的对决。效果: 允许拳手与相同重量级的对手交手,如果对手是不同重量级,则会出现错误。使类型中的某些方法接受特定于其子类型的参数。定义MmaFighter 的一些子类型。
2024-05-27 09:23:38
649
原创 【设计模式】JAVA Design Patterns——Converter(转换器模式)
转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。此外,Converter模式引入了双向集合映射,从而将样板代码减少到最少。在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层DTO来使用的实体。对于潜在的大量类进行类似的映射,我们需要一种通用的方法来实现这一点。现在就可以做到User和UserDto之间的映射编简单。转换器模式让一个类的实例映射成另一个类的实例变得简单。
2024-05-25 10:52:45
1183
4
原创 【设计模式】JAVA Design Patterns——Composite Entity(复合实体模式)
对于一个控制台对象,需要管理许多接口功能。通过使用复合实体模式,将消息对象、信号对象等依赖性对象组合在一起,直接使用单个对象对其进行控制。复合实体模式用于对一组相关联的持久化对象进行建模、描述和管理,用于取代对这组对象描述为单独粒度的实体。复合实体模式允许使用一个统一对象来管理一组相互关联的对象。适用console 复合实体进行消息对象,信号对象的分配。创建一个console复合实体继承上面的通用类。创建一个通用的符合对象。
2024-05-25 10:40:35
500
原创 【设计模式】JAVA Design Patterns——Composite(组合模式)
在软件工程中,组合模式是一种分区设计模式。组合模式中,一组对象将像一个对象的单独实例一样被对待。组合的目的是将对象“组成”树状结构,以表示部分整体层次结构。实现组合模式可使客户统一对待单个对象和组合对象。每个句子由单词组成,单词又由字符组成。这些对象中的每一个都是可打印的,它们可以在它们之前或之后打印一些内容,例如句子始终以句号结尾,单词始终在其前面有空格。将对象组合成树结构以表示部分整体层次结构。组合可以使客户统一对待单个对象和组合对象。组合模式使客户能够以统一的方式对待各个对象。
2024-05-24 13:58:13
379
4
原创 【设计模式】JAVA Design Patterns——Commander(指挥官模式)
如果当前运输可用,但支付服务不可用,或者反之,当我们已经收到用户的订单后,我们应该如何处理?我们需要有一个机制来处理这些情况。我们必须将订单指向其中一个服务(在这个例子中是运输),然后将订单添加到另一个服务的数据库中(在这个例子中是支付),因为两个数据库不能原子地更新。如果我们当前无法做到这一点,应该有一个队列,可以将这个请求排队,并且必须有一个机制,允许队列中出现失败。所有这些都需要通过不断的重试,在保证幂等性(即使请求多次,变化只应用一次)的情况下,由一个指挥类来完成,以达到最终一致性的状态。
2024-05-24 13:49:17
554
原创 【设计模式】JAVA Design Patterns——Command(事务模式)
有一个巫师在地精上施放咒语。咒语在地精上一一执行。第一个咒语使地精缩小,第二个使他不可见。然后巫师将咒语一个个的反转。这里的每一个咒语都是一个可撤销的命令对象。在面向对象编程中,命令模式是一种行为型设计模式,它把在稍后执行的一个动作或触发的一个事件所需要的所有信息封装到一个对象中。将请求封装为对象,从而使你可以将具有不同请求的客户端参数化,队列或记录请求,并且支持可撤销操作。用命令对象的方式存储请求以在将来时可以执行它或撤销它。创建咒语的目标:地精。
2024-05-23 10:49:51
803
7
原创 【设计模式】JAVA Design Patterns——Combinator(功能模式)
简单地说,有一些类型 T,一些用于构造类型 T 的“原始”值的函数,以及一些可以以各种方式组合类型 T 的值以构建更复杂的类型 T 值的“组合器”在计算机科学中,组合逻辑被用作计算的简化模型,用于可计算性理论和证明理论。尽管组合逻辑很简单,但它捕获了计算的许多基本特征。组合器是一个高阶函数,仅使用函数应用程序和之前定义的组合器来定义其参数的结果。从开发人员的角度来看,API 由领域中的术语组成。组合器允许从先前定义的“事物”创建新的“事物”。另一个组合器用于一些复杂的查找器。首先构造一个实例,然后执行它。
2024-05-23 09:35:53
592
原创 【设计模式】JAVA Design Patterns——Static Content Hosting(静态内容托管模式)
与由 Web 应用程序生成的动态网页相反,静态网页(有时称为平面网页或固定网页)是完全按照存储的方式传送到用户的网页浏览器的网页。静态内容托管模式利用云原生存储服务来存储内容和全球内容交付网络,将其缓存在世界各地的多个数据中心。全球性的营销网站(静态内容)需要快速的部署以开始吸引潜在的客户。CloudFormation 分发部署需要一些时间,但一旦完成,您的网站就会从全球各地的数据中心提供服务!命令的舒勇将显示准确的分配配置项,包括包括可用于测试的生成的 CloudFront 域名,例如。
2024-05-22 17:27:32
1172
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人