- 博客(47)
- 资源 (6)
- 收藏
- 关注
原创 Go后端架构探索:从 MVC 到 DDD 的演进之路
`MVC`和`DDD`是后台开发两种流行的分层架构思想,`MVC`(Model-View-Controller)是一种设计模式,主要用于分离用户界面、业务逻辑和数据模型,便于分层解耦,而`DDD`(领域驱动设计)则是一种架构方法论,旨在通过构建业务领域模型来解决复杂系统中的设计和维护难题。
2025-03-30 21:01:55
1147
原创 探索MVC、MVP、MVVM和DDD架构在不同编程语言中的实现差异
MVC适用于快速开发 Web 应用,强调职责分离。MVP适用于对视图和业务逻辑分离要求较高的场景,强调展示层对视图和模型的协调。MVVM适用于复杂视图与模型交互的应用,利用数据绑定机制自动同步视图和模型的状态。DDD适用于复杂业务系统,强调领域建模。核心优势:代码可维护性强,团队协作效率高。选型建议:中小型项目优先考虑 MVC,复杂业务系统可结合 DDD。要用 MVC 吗?90% 的 Web 项目都适合 MVC 架构如何判断适用性?
2025-03-28 17:40:05
1260
原创 一文搞清楚 JavaScript prototype 原型链
每个 JavaScript函数(构造函数)都有一个prototype属性,它是一个对象。所有由该函数创建的实例对象都会继承这个原型对象的属性和方法。// 方法添加到原型,所有实例共享${this} // 方法添加到原型,所有实例共享 Person . prototype . sayHello = function() {
2025-03-27 10:31:38
842
原创 DDD领域驱动设计详解-Java/Go/JS/Python语言实现
领域驱动设计(Domain-Driven Design,简称 DDD)是一种软件架构方法,旨在通过分层和领域建模的方式来管理复杂业务逻辑。DDD 主要通过分层架构来组织代码,以实现高内聚、低耦合。
2025-03-25 09:29:33
1056
原创 什么是多态?一文彻底搞懂!
多态包括编译时多态和运行时多态。编译时多态,即静态绑定,通常通过方法重载实现。运行时多态则是在代码运行时确定具体调用的方法。从Java的角度看,严格意义上的多态需要满足三个条件:继承、方法覆盖和父类引用子类对象。Java完全符合这些要求,实现了严格意义上的多态。尽管Go语言、Python和JavaScript不完全符合严格意义上的多态,它们仍能够实现多态效果。多态的核心在于动态确定运行的方法,从而使代码更加灵活、易于维护和扩展。Go语言虽然没有继承和方法重载,但仍能实现多态效果。
2024-06-24 11:50:12
3820
原创 Java实现数组去重复的18种写法
数组(含List)去重复在日常工作中经常遇到,很多时候用到Set数据结构,但有时候我们需要针对数据进行干预,这时候就需要用其他的实现方式了。以下列出各种的去重方式,基本含括了所有情况。
2023-07-21 13:49:32
7512
1
原创 JavaScript实现归并排序算法详解
归并排序(Merge Sort)算法,也叫合并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。
2023-07-06 14:01:11
1514
原创 【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
访问者模式(Visitor Pattern)是一种行为型模式。它封装一个访问者类,把各元素类的操作集合起来,目的是将数据结构与数据操作分离。在不改变原有元素类数据结构的前提下,改变了元素类的执行算法。当某些较为稳定的东西(数据结构或算法),不想直接被改变但又想扩展功能,这时候适合用访问者模式。访问者模式的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。
2023-05-04 11:04:41
488
原创 【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。以此基于公共的模板,来实现实现不同的功能。模板模式适用于一些复杂操作进行步骤分割、抽取公共部分由抽象父类实现、将不同的部分在父类中定义抽象实现、而将具体实现过程由子类完成。
2023-04-29 21:51:57
736
原创 【策略设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
策略模式(Strategy Pattern)属于行为型设计模式。将每一个算法封装到具有共同接口的独立类中,根据需要来绑定策略,使得具体实现和策略解耦。当你想使用对象中各种不同的算法变体,使用if...else 所带来的复杂和难以维护,可使用策略模式。或者当有许多相同类,它们仅在执行某些行为时略有不同,可使用策略模式。
2023-04-28 09:17:01
803
原创 【单例设计模式多种版本】Java/JS/Go/Python/TS不同语言实现
单例模式(Singleton Pattern)属于创建型设计模式,这种模式只创建一个单一的类,保证一个类只有一个实例,并提供一个访问该实例的全局节点。当您想控制实例数目,节省系统资源,并不想混用的时候,可以使用单例模式。单例有很多种实现方式,主要分为懒汉和饿汉模式,同时要通过加锁来避免线程安全。不同语言的单例实现略有差异,可以通过查看不同版本的源码来深入理解其中的差异。
2023-04-27 09:11:46
136
原创 【代理设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
代理模式(Proxy Pattern)是一种结构型设计模式,用一个类来代理另一个类或几个类的功能。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。延迟初始化(虚拟代理)。如果你有一个偶尔使用的重量级服务对象,一直保持该对象运行会消耗系统资源时,可使用代理模式。访问控制(保护代理)。如果你只希望特定客户端使用服务对象,这里的对象可以是操作系统中非常重要的部分,而客户端则是各种已启动的程序 (包括恶意程序), 此时可使用代理模式。
2023-04-25 09:26:26
269
原创 【原型设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
原型模式(Prototype Pattern)是一种创建型设计模式,使你能够复制已有对象,而无需使代码依赖它们所属的类,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。如果你需要复制一些对象,同时又希望代码独立于这些对象所属的具体类,可以使用原型模式。
2023-04-24 11:14:32
244
原创 【观察者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
观察者模式(Observer Pattern)是一种行为型模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式使用三个类Subject、Observer和Client。Subject对象带有绑定观察者到Client对象和从Client对象解绑观察者的方法。我们创建Subject类、Observer抽象类和扩展了抽象类Observer的实体类。
2023-04-21 21:00:00
134
原创 【备忘录设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
备忘录模式(Memento Pattern)是一种结构型设计模式。这种模式就是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并放在外部存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。备忘录模式的角色有三个:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色备忘录模式是由发起人(Originator)对象负责生成状态快照,其他对象不可修改状态。
2023-04-20 11:46:05
303
原创 【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
中介者模式(Mediator Pattern)是一种行为型模式。它限制对象之间的直接交互,它用一个中介对象来封装一系列的动作,以让对象之间进行交流。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。当一些对象和其他对象紧密耦合以致难以对其进行修改时,或当组件因过于依赖其他组件而无法在不同应用中复用时,可使用中介者模式。
2023-04-19 18:53:00
125
原创 【迭代器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
迭代器模式(Iterator Pattern),是一种结构型设计模式。给数据对象构建一套按顺序访问集合对象元素的方式,而不需要知道数据对象的底层表示。迭代器模式是与集合共存的,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像Java中的Collection,List、Set、Map等,这些集合都有自己的迭代器。假如我们要实现一个这样的新的容器,就可以引入迭代器模式,给我们的容器实现一个迭代器。
2023-04-17 12:11:10
264
原创 【解释器设计模式详解】C/Java/Go/JS/TS/Python不同语言实现
解释器模式(Interpreter Pattern)是一种行为型设计模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式常被用在 SQL 解析、符号处理引擎等。解释器模式常用于对简单语言的编译或分析实例中,为了掌握好它的结构与实现,必须先了解编译原理中的“文法、句子、语法树”等相关概念。
2023-04-12 17:59:55
227
原创 【享元设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
享元模式(Flyweight Pattern),是一种结构型设计模式。主要用于减少创建对象的数量,以减少内存占用和提高性能。它摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。当程序需要生成数量巨大的相似对象时,可能对内存有大量损耗,而对象中包含可抽取且能在多个对象间共享的重复状态,您可以采取享元模式。内部状态 vs. 外部状态。
2023-04-10 18:24:28
129
原创 【外观设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
外观模式(Facade Pattern),也叫门面模式,是一种结构型设计模式。它向现有的系统添加一个高层接口,隐藏子系统的复杂性,这个接口使得子系统更加容易使用。如果你需要一个指向复杂子系统的直接接口,且该接口的功能有限,则可以使用外观模式。或者需要将子系统组织为多层结构,可以使用外观。
2023-04-08 00:00:00
94
原创 【过滤器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
过滤器模式(Filter Pattern)或标准模式(Criteria Pattern),是一种结构型模式。这种模式允许使用不同的标准条件来过滤一组对象,并通过逻辑运算的方式把各条件连接起来,它结合多个标准来获得单一标准。例子将创建一个 Person 对象、Criteria 接口和实现了该接口的实体类,来过滤 Person 对象的列表。Test 类使用 Criteria 对象,基于各种标准和它们的结合来过滤 Person 对象的列表。
2023-04-06 12:03:25
182
原创 【装饰器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
装饰器模式(Decorator Pattern)是一种结构型设计模式。将对象放入到一个特殊封装的对象中,为这个对象绑定新的行为,具备新的能力,同时又不改变其原有结构。如果你希望在无需修改代码的情况下即可使用对象,且希望在运行时为对象新增额外的行为,可以使用装饰模式。或者你用继承来扩展对象行为的方案难以实现或者根本不可行,你可以使用该模式。
2023-04-04 17:27:07
139
原创 【组合设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
组合模式(Composite Pattern),又叫部分整体模式,是一种结构型设计模式。用于把一组类似的对象当作一个单一的对象来看。组合模式依据树形结构来组合对象,用不同组件来构建某个部分或整体对象。如果你需要实现树状对象结构,可以使用组合模式。如果你希望客户端代码以相同方式处理简单和复杂元素,可以使用该模式。
2023-04-03 18:13:23
149
原创 【命令设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
命令模式(Command Pattern)是一种数据驱动的设计模式,也是一种行为型设计模式。这种模式的请求以命令的形式包裹在对象中,并传给调用对象。调用对象再寻找合适的对象,并把该命令传给相应的处理者。即把请求或操作封装成单个对象,并使其可以被参数化和延迟执行,这种方式将命令和执行者进行了有效解耦。如果你需要通过操作来参数化对象,可使用命令模式。如果你想要将操作放入队列中、操作的执行或者远程执行操作, 可使用命令模式。如果你想要实现操作回滚功能,可使用命令模式。
2023-03-30 21:30:00
167
原创 【JavaScript快速排序算法】不同版本源码分析
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归或迭代进行,以此让整个数列变成有序序列。
2023-03-27 11:33:03
159
原创 【责任链设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
这种模式为请求创建了一个接收者对象的链,允许你将请求沿着处理者链进行发送,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。当程序需要使用不同方式来处理多种类请求,且请求类型和顺序不可知,或者当必须按顺序执行多个处理时,可以使用责任链模式。避免请求发送者与接收者耦合在一起,客户只需要将请求发送到链上,而无须关心请求的处理细节和请求的传递。创建多个互不干涉的处理器,实现抽象类的next方法,以便不断执行链式检查。抽象处理器类可将各子类按任意组织为链式,以便调用。func.h 头文件函数。
2023-03-24 18:21:35
220
原创 【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现
当你希望使用代码创建不同形式的产品 (例如各种商品和订单) 时, 一些基本部件不会变,而其组合经常变化的时候,就可以考虑建造者模式。主管类隐藏了产品构造细节, 客户端只需要将一个生成器与主管类关联,就能从生成器处构造对象。客户端同时创建生成器和主管类,所有产品都遵循相同的接口,构造结果通过主管类获取。当需要创建复杂对象的时候,由各个部分的子对象来逐步构建,以适应复杂多变的情况。具体的建造者类之间是相互独立的,这有利于系统的扩展。为每个形式的产品创建具体生成器类,并实现其构造步骤。具体建造者类,可以多个。
2023-03-13 17:56:31
146
原创 【质因数分解算法详解】C/Java/Go/Python/JS/Dart/Swift/Rust等不同语言实现
但说实话OC的语法看起来不是很友好,从变量声明到对象调用,看起来与其他语言不是很一致,但总体上来也是类c的,所以本质上还是一样。Rust从语法上足够精炼,风格比较像普通的高级语言,提供的元组(Tuple)和动态数组(Vector)、切片(Slice)模式非常方便,没有C/C++操作数据那么繁琐,但同时其又保持了底层语言的优越性能,能看得出来Rust是牛人精心打造的。当全部分解后,有的情况下最后的得数刚好被质数除尽,最后的得数为1,有的情况则质数的平方大于得数,终止了循环,此时该得数大于1,就是最后的因数。
2023-03-11 11:17:21
1623
原创 【桥接设计模式详解】Java/JS/Go/Python/TS不同语言实现
桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,来实现二者的解耦。如果你希望在几个独立维度上扩展一个类,或者你想要拆分、重组一个具有多重功能的复杂类(例如能与多个数据库服务器进行交互的类),或者你想在运行时切换不同的实现方法,可以使用桥接模式。建立具体对象类,继承自基础抽象类,调用工具类里的方法来实现具体功能。建立多个具体工具类实现基础工具接口,这些工具是负责具体能力实现。定义一个工具接口,供不同工具类来实现。
2023-03-11 07:50:29
164
原创 【希尔排序算法详解】Java/Go/Python/JS/C不同语言实现
希尔排序(Shell Sort)是插入排序的一种改进版,也称递减增量排序算法(Diminishing Increment Sort),其实质是将数列分组,然后再按插入算法分别排序,因DL.Shell于1959年提出而得名。在希尔的原稿中建议的初始步长是N/2,就是将每一次排序分成两半,这样取步长在大多数情况下会比插入排序好,但也不是最好。步长序列:2i3j 最坏情况复杂度:O(nlog2n)步长序列:2k-1 最坏情况复杂度:O(n3/2)步长序列:n/2i 最坏情况复杂度:O(n2)空间复杂度:O(1)
2023-03-10 17:47:35
104
原创 【选择排序算法详解】Java/Go/Python/JS/C 不同语言实现
首先在待排序序列中找到最小(或最大)的元素,追加到已排序序列中,然后继续从待排序序列中寻找最小(或最大)的元素,追加到已排序序列的尾部。比较次数O(n^2),比较次数与关键字的初始状态无关,总的比较次数N = (n-1) + (n-2) +…选择排序的比较操作为n(n-1)/2次之间。在外循环中将第 1 项与最小值进行交换,然后以第 2 项作为最小值,再重复执行步骤 2,直到遍历完全部待排序区间。设第 1 项为最小值,在内循环中将其逐个与后项进行比较,如果遇到更小的值,则更新最小值,并记录下最小值的下标。
2023-03-07 19:21:03
102
原创 【基数排序算法详解】Java/Go/Python/JS/C不同语言实现
基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。LSD使用计数排序或桶排序,MSD可以使用桶排序。计数排序:根据数组值设定若干个桶,每个桶对应一个数值,将这些桶的值分别存入下一个桶中用于排序,最后按顺序取出对应桶里的值。桶排序:根据情况分为若干个桶,每个桶存储一定范围的数值,每个桶再单独排序,最后按桶的顺序取出全部数据。
2023-03-05 20:07:08
163
1
原创 【快速排序算法详解】Java/Go/Python/JS/C不同语言实现
快排是一种通过基准划分区块,再不断交换左右项的排序方式,其采用了分治法,减少了交换的次数。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归或迭代进行,以此让整个数列变成有序序列。将基准点左侧全部项和基点右侧全部项分别通过递归(或迭代)方式重复第1项,直到所有数组都交换完成。空间复杂度:根据实现方式的不同而不同,可以查看不同版本的源码。平均时间复杂度:O(NlogN)
2023-02-23 17:34:34
92
原创 【合并两个已排序数组算法详解】Java/Go/Python/JS不同语言实现
从两个数组的第1项开始比较,将数值小的一项添加到新数组中,并将数值小的指针右移1位,继续两两比较,哪个小就添加到新数组中,并且右移小项的指针,直到遍历完其中一个数组,也就是把1个数组项全部添加到新数组时终止。策略三:将一个数组的长度扩展成两个数组之和,按照任意一种排序,将这个数组当成是已排序部分,遍历另外1个数组,将另外1个数组项逐个插入到这个数组中的位置中去。同时遍历数组1和数组2,比较数组1和数组2里的第一项,哪个小就追加到新数组中,小项的指针后移1位。新建1个空数组,长度为两个数组之和。
2023-02-20 18:12:57
204
原创 【归并排序算法详解】Java/Go/Python/JS/C不同语言实现
归并排序(Merge Sort)算法,也叫合并排序,是创建在归并操作上的一种有效的排序算法。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。将上述两个序列递归合并,按照已排序数组合并,形成(n/4)个序列,每个序列包含4个数字。这里有多种语言的详细源码。
2023-02-19 18:09:13
85
原创 【堆排序算法详解】Java/Go/Python/JS/C不同语言实现
堆排序(Heap Sort)算法,是将数据看成近似完全二叉树结构,并根据完全二叉树的特性来进行排序的一种算法。完全二叉树要求每个节点的值都大于等于其左右子节点的值,称为大顶堆;或者每个节点的值都小于或等于其左右子节点的值,称为小顶堆。先将父节点的最大数取出,并构建最大堆,再将堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束。
2023-02-18 16:34:06
97
原创 【计数排序算法详解】Java/Go/Python/JS/C不同语言实现
计数排序(Counting sort)是一种稳定的线性时间排序算法。计数排序使用一个额外的数组,数组的下标对应待排序的数字。就像给每个位置按数字顺序做好标记,然后把对应数组放入其中,最后把下标打印出来即可。计数排序适合数量较少的整数排序,对于浮点不太适合。遍历待排序数组,将数字与计数数组下标对应,按出现次数做标记;Java/Go/Python/JS/C 不同语言实现计数排序算法。新建一个计数数组,长度为最大与最小值的差值+1;平均时间复杂度:O(n + k)最佳时间复杂度:O(n + k)
2023-02-17 13:50:27
100
原创 【桶排序算法详解】Java/Go/Python/JS/C 不同语言实现
桶排序(Bucket sort)也称箱排序,是一个排序算法,工作原理是将数组分到几个桶里,桶的数量可由排序数组最大值与最小值关系决定,可以固定几个桶。确定每个桶的大小以及桶的数量,桶大小为可以最大项与最小的差值除以最小值,桶的数量是大小差值除以桶大小;新建一个桶二维数组,用于存放桶数据,桶的数量和每个桶的大小就是第 1 步得到的值;遍历原始列表,再将数组项除以桶的个数得到桶的下标,将当前数组项存入到对应桶中;在存入桶中时,按顺序插入,保持桶内的顺序;平均时间复杂度 O(n+k)最差空间复杂度 O(n。
2023-02-13 14:47:46
181
C语言的科学和艺术-源代码
2010-03-12
JSEclipse 好用的Eclipse下JS开发插件
2009-09-10
jspSmartUpload
2009-09-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人