- 博客(152)
- 收藏
- 关注
原创 React 通过 Immer 解决复杂状态(嵌套对象 / 数组)
Immer 是 React 开发中处理不可变状态的优秀工具,它通过简化状态修改逻辑,减少了手动创建副本的冗余代码,同时保证了 React 组件的正确渲染。使用建议对于简单状态,可以继续使用手动更新。对于复杂状态(嵌套对象 / 数组),强烈推荐使用 Immer 提高开发效率。
2025-11-27 14:15:16
244
原创 React 组件之间的交互方式都有哪些?
简单父子关系:优先用props和回调函数。多层级共享:用或组合模式。复杂全局状态:用 Redux、MobX 等工具。特殊场景(如 DOM 操作):用ref转发。选择时需权衡组件耦合度、性能和代码可维护性。
2025-11-19 09:25:12
1041
原创 什么是发布订阅模式?JavaScript 实现一个发布订阅模式的示例
发布订阅模式(Publish-Subscribe Pattern)是一种行为型设计模式,它通过引入一个 “事件中心”(或 “消息代理”),实现发布者(发布事件的对象)与订阅者(接收事件的对象)的解耦。订阅者通过事件中心订阅感兴趣的事件,并注册回调函数。发布者通过事件中心发布事件,事件中心会自动通知所有订阅该事件的订阅者,执行其回调函数。发布者和订阅者之间无需直接关联,完全通过事件中心通信,降低了对象间的耦合度。
2025-11-18 20:29:21
743
原创 什么是访问者模式?JavaScript 实现一个访问者模式的示例
访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不修改现有类的前提下,为一组不同类型的对象添加新的操作。其核心思想是:将对象的 “数据结构” 与 “操作行为” 分离,通过一个 “访问者” 对象封装对数据结构的操作,不同的访问者可以实现不同的操作逻辑,而数据结构中的对象只需提供一个接收访问者的接口。
2025-11-18 20:28:56
674
原创 什么是解释器模式?JavaScript 实现一个解释器模式的示例
解释器模式(Interpreter Pattern)是一种行为型设计模式,它定义了一种语言的语法规则,并通过一个 “解释器” 来解释执行该语言中的句子(表达式)。其核心思想是:将复杂的语法规则拆分为简单的 “终结符” 和 “非终结符”,通过递归组合这些符号,构建一个解释器来解析和执行表达式。这种模式适合处理简单的语法解析场景(如数学表达式计算、简单规则引擎)。
2025-11-18 20:28:42
529
原创 什么是享元模式?JavaScript 实现一个享元模式的示例
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享多个对象中相同的部分(内部状态),来减少内存占用和对象数量,从而提高系统性能。其核心思想是:将对象的状态分为内部状态(可共享、不随环境变化的部分)和外部状态(不可共享、随环境变化的部分)。通过共享内部状态,复用已创建的对象,仅在必要时通过外部状态区分不同场景。
2025-11-18 20:28:28
497
原创 什么是中介者模式?JavaScript 实现一个中介者模式的示例
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象,封装多个对象(同事)之间的交互关系,使同事对象无需直接相互引用,而是通过中介者间接通信。其核心思想是:将多对象间的 “网状交互” 转化为 “星状交互”(所有对象都与中介者交互),降低对象间的耦合度,使系统更易于维护和扩展。
2025-11-18 20:28:13
384
原创 什么是职责链模式?JavaScript 实现一个职责链模式的示例
职责链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求的发送者与接收者解耦,使多个对象都有机会处理请求。请求沿着一个 “链” 传递,直到链中的某个对象处理该请求为止。其核心思想是:为请求创建一个接收者对象的链,每个接收者都包含对下一个接收者的引用。当请求发出时,它会沿着链传递,直到有一个接收者处理它,或者到达链的末端(请求未被处理)。
2025-11-17 18:53:50
301
原创 什么是命令模式?JavaScript 实现一个命令模式的示例
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,使你可以用不同的请求参数化其他对象(如队列、日志),并支持请求的撤销、排队和延迟执行。其核心思想是:将 “发出命令的对象(调用者)” 与 “执行命令的对象(接收者)” 解耦,通过一个 “命令对象” 作为中间层,封装具体的操作和参数。调用者只需触发命令,无需知道命令如何执行;接收者只需执行命令,无需知道谁发起了命令。
2025-11-17 18:53:15
359
原创 什么是迭代模式?JavaScript 实现一个迭代模式的示例
迭代模式(Iterator Pattern)是一种行为型设计模式,它提供一种统一的方式遍历聚合对象(如数组、列表、树等)中的元素,而无需暴露聚合对象的内部结构。其核心思想是:将遍历逻辑与聚合对象分离,通过一个 “迭代器” 对象负责遍历操作,聚合对象只需提供获取迭代器的接口,客户端通过迭代器即可按顺序访问元素,无需关心聚合对象的具体实现(如数组、链表、树等)。以下以 “自定义列表集合” 为例,实现迭代模式。
2025-11-17 18:52:45
367
原创 什么是组合模式?JavaScript 实现一个组合模式的示例
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构,并以统一的方式处理单个对象和组合对象。其核心思想是:单个对象(叶子节点)和组合对象(容器节点)具有相同的接口,客户端无需区分它们,只需通过统一接口操作整个树形结构。这种模式适合表示 “部分 - 整体” 关系(如文件系统中的文件与文件夹、组织架构中的员工与部门)。
2025-11-17 18:52:12
390
原创 什么是备忘录模式?JavaScript 实现一个备忘录模式的示例
备忘录模式(Memento Pattern)是一种行为型设计模式,它用于捕获一个对象的内部状态,并在不暴露对象实现细节的前提下,将状态保存起来,以便后续需要时恢复该对象到之前的状态。其核心思想是:通过一个 “备忘录” 对象存储目标对象的状态,目标对象(原发器)负责创建和恢复备忘录,而 “负责人” 对象负责管理备忘录的存储和获取,从而实现状态的快照保存与回滚。
2025-11-17 18:51:34
300
原创 什么是状态模式?JavaScript 实现一个状态模式的示例
状态模式(State Pattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了它的类。其核心思想是:将对象的不同状态封装为独立的状态类,每个状态类实现该状态下的具体行为,对象通过切换状态类来改变自身行为,而无需使用大量条件判断(if-else或switch。
2025-11-17 18:50:56
306
原创 什么是建造者模式?JavaScript 实现一个建造者模式的示例
建造者模式(Builder Pattern)是一种创建型设计模式,它将复杂对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。其核心思想是:将复杂对象的创建步骤分解为多个独立的 “建造步骤”,由专门的 “建造者” 负责实现这些步骤,再由 “指挥者” 控制建造步骤的执行顺序,最终构建出完整对象。这样既可以灵活定制对象的各个部分,又能保证构建过程的规范性。以下以 “电脑组装” 为例,实现建造者模式。
2025-11-17 18:50:20
394
原创 什么是模板方法模式?JavaScript 实现一个模板方法模式的示例
模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义一个操作的算法骨架(模板方法),将算法的一些步骤延迟到子类中实现。模板方法确保算法的结构不变,而子类可以按需重写具体步骤,从而在不改变算法整体流程的前提下,灵活定制部分细节。其核心思想是 “封装不变,扩展可变”:将通用流程(不变部分)放在父类的模板方法中,将具体实现(可变部分)交给子类,既保证了算法的一致性,又允许子类灵活扩展。
2025-11-17 18:49:35
326
原创 什么是原型模式?JavaScript 实现一个原型模式的示例
原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制已有对象作为原型,复制(克隆)该原型来创建新对象,而无需重新初始化对象。新对象的属性和方法基于原型对象复制而来,既可以复用原型的功能,又可以在复制后修改自身属性,实现 “基于模板创建对象” 的效果。在 JavaScript 中,原型模式是语言原生支持的核心模式(基于原型链实现),所有对象都有一个prototype(原型),新对象可以通过原型链继承原型的属性和方法。
2025-11-17 18:48:41
330
原创 什么是策略模式?JavaScript 实现一个策略模式的示例
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法(或行为),并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端,从而实现 “算法灵活切换” 和 “客户端与算法解耦”。将可变的行为(算法)提取为独立的策略类,客户端通过组合而非继承的方式使用这些策略,避免用大量条件判断(if-else或switch)来选择不同行为。
2025-11-17 18:46:33
405
原创 什么是观察者模式?JavaScript 实现一个观察者模式的示例
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一对多依赖关系:当一个对象(被观察者)的状态发生变化时,所有依赖它的对象(观察者)会自动收到通知并更新。这种模式的核心是解耦被观察者和观察者,让它们可以独立变化。被观察者只需维护一个观察者列表,无需知道具体观察者的细节;观察者只需等待通知,无需主动查询被观察者的状态。
2025-11-14 13:55:40
758
原创 什么是抽象工厂模式?JavaScript 实现一个抽象工厂模式的示例
抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。与工厂方法模式(单个产品对应单个工厂)不同,抽象工厂模式聚焦于产品族(一组相关联的产品,如 “中式家具” 包含椅子、桌子、沙发,“西式家具” 也包含对应产品)的创建,通过抽象工厂接口定义产品族的创建方法,由具体工厂实现不同产品族的创建逻辑。
2025-11-14 10:02:11
231
原创 什么是单例模式?JavaScript 实现一个单例模式的示例
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式的核心是控制对象的创建过程,防止重复实例化,常用于需要共享资源或全局状态的场景(如配置管理器、日志工具、全局缓存等)。
2025-11-14 10:00:08
378
原创 什么是适配器模式?JavaScript 实现一个适配器模式的示例
适配器模式(Adapter Pattern)是一种结构型设计模式,它能让接口不兼容的对象相互合作。当一个类(或对象)的接口与客户端期望的接口不一致时,适配器可以作为 “中间层”,将原有接口转换为客户端需要的接口,从而解决接口不匹配的问题。适配器模式的核心是 “转换接口”,而非修改原有接口或客户端代码,常用于整合遗留系统、第三方库等已有组件。
2025-11-14 09:57:56
344
原创 什么是外观模式?JavaScript 实现一个外观模式的示例
外观模式(Facade Pattern)是一种结构型设计模式,它为复杂子系统提供一个统一的高层接口,使子系统更易于使用。客户端模式通过封装子系统的内部复杂性,对外暴露简单的调用入口,让客户端无需关心子系统的具体实现和交互细节,只需调用外观接口即可完成操作。
2025-11-14 09:52:56
255
原创 什么是装饰模式?JavaScript 实现一个装饰模式的示例
装饰模式(Decorator Pattern)是一种结构型设计模式,它允许动态地给一个对象添加额外的功能,而无需修改其原始结构。装饰模式通过 “包装” 目标对象(使用组合而非继承),在不改变对象自身的前提下,扩展其行为。用装饰器类包裹目标对象,在调用目标方法的前后添加新功能,且装饰器可以嵌套使用,实现多层功能扩展。
2025-11-14 09:49:27
378
原创 什么是工厂方法模式?JavaScript 实现一个代理模式的示例
工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义一个用于创建对象的接口(或抽象方法),但将具体对象的创建延迟到子类中。与简单工厂模式不同,工厂方法模式不通过一个统一的工厂类创建所有对象,而是为每个产品类型对应一个具体工厂,由具体工厂负责创建对应的产品。这样,当新增产品时,无需修改现有工厂代码,只需新增产品类和对应的工厂类,更符合 “开闭原则”。
2025-11-14 09:46:49
232
原创 什么是简单工厂模式?JavaScript 实现一个简单工厂模式的示例
简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,它通过一个工厂类统一负责创建其他类的实例,客户端无需直接实例化具体对象,只需向工厂传递参数,由工厂决定创建哪种类型的对象。其核心作用是将对象的创建逻辑与使用逻辑分离,降低客户端与具体类的耦合,便于后续扩展(如新增产品类型时,只需修改工厂类,无需修改客户端)。
2025-11-14 09:15:20
235
原创 什么是代理模式?JavaScript 实现一个代理模式的示例
代理模式(Proxy Pattern)是一种结构型设计模式,它通过引入一个 “代理对象” 来控制对 “目标对象” 的访问。代理对象可以在不改变目标对象核心功能的前提下,增加额外的逻辑(如权限校验、缓存、日志记录、延迟加载等),从而实现对目标对象的间接访问和增强。
2025-11-14 09:05:29
305
原创 桥接模式、适配器模式和外观模式的区别
桥接模式、适配器模式和外观模式是设计模式中用于解耦和简化系统设计的重要模式,但它们的核心目标、应用场景和实现方式有显著区别。核心是通过 “组合” 替代 “继承”,避免抽象与实现的紧耦合,让两者能各自扩展。将一个类的接口转换成客户端期望的另一个接口,使原本因接口不匹配而无法一起工作的类可以协同工作。为子系统中的一组接口提供一个统一的高层接口,使子系统更易于使用。核心是 “简化接口”,隐藏子系统的复杂性。三者均属于结构型模式,但桥接侧重 “分离”,适配器侧重 “兼容”,外观侧重 “简化”。
2025-11-14 08:50:54
756
原创 什么是敏捷开发,以及敏捷开发的主要活动
敏捷开发以用户需求进化为核心,采用迭代、循序渐进的方式进行软件开发,不依赖完整的前期规划,而是通过小步快跑的迭代周期,不断调整产品方向、完善功能。
2025-11-12 20:01:28
294
原创 文件与文件服务共享存储
文件与文件服务的共享存储是指通过技术手段将存储资源池化,让多个文件服务实例、客户端或应用程序能够共同访问和管理同一组文件数据,实现数据的集中存储、共享访问和统一管理。这种架构广泛应用于分布式系统、企业级文件共享、云存储等场景,核心目标是提升数据可用性、简化管理并提高资源利用率。 共享存储的核心需求 1. 多节点并发访问:支持多个文件服务实例(如NFS服务器、S3网关)或客户端同时读写同一文件/目录,需解决并发冲突(如脏写、数据不一致)。2. 数据一致性:确保不同节点访问到的文件内容、元数据(权限、修改时间等
2025-11-10 22:56:30
549
原创 逻辑架构、开发架构、数据架构、物理架构、运行架构的区别
这五种架构是软件架构的 “五维视图”:逻辑架构定义 “功能骨架”,开发架构定义 “实现方式”,数据架构定义 “数据底座”,物理架构定义 “硬件载体”,运行架构定义 “动态行为”。它们相互关联、层层支撑,比如逻辑架构的模块需通过开发架构落地为代码,通过物理架构部署到硬件,通过运行架构实现动态交互,数据架构则为所有维度提供数据支撑。
2025-11-07 08:50:56
554
原创 什么是桥接模式? JavaScript 实现一个桥接模式的示例
桥接模式定义将抽象部分与它的实现部分分离,使它们都可以独立地变化。核心是通过 “组合” 替代 “继承”,避免抽象与实现的紧耦合,让两者能各自扩展。核心意图解决多维度变化的问题:当一个类存在两个或多个独立变化的维度(如 “抽象类的变化” 和 “具体实现的变化”),通过桥接将维度分离,各自独立扩展。例如:“形状”(抽象维度:圆形、方形)和 “颜色”(实现维度:红色、蓝色),桥接后可灵活组合(红圆、蓝方等),且新增形状或颜色无需修改原有代码。结构抽象化角色(Abstraction)
2025-11-07 08:47:57
331
原创 原码,反码,补码
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
2025-11-07 08:39:28
205
原创 正则表达式整理成表格形式
匹配exp,并捕获文本到名称为name的组里,也可以写成(?匹配exp,不捕获匹配的文本,也不给此分组分配组号。匹配任意不是字母,数字,下划线,汉字的字符。匹配除了aeiou这几个字母以外的任意字符。重复1次或更多次,但尽可能少重复。重复0次或1次,但尽可能少重复。匹配不是单词开头或结束的位置。匹配后面跟的不是exp的位置。匹配除换行符以外的任意字符。重复任意次,但尽可能少重复。匹配任意不是空白符的字符。匹配除了x以外的任意字符。匹配前面不是exp的位置。匹配单词的开始或结束。匹配任意非数字的字符。
2025-11-07 08:39:13
252
原创 正则表达式梳理
(用户名 + @ + 域名 + . + 后缀,如 "user@example.com")(支持正负整数和小数,如 "123"、"-45.67")(支持 http/https/ftp,匹配合法网址)根据具体需求,可组合上述规则构建更复杂的正则表达式。(以 1 开头,第二位 3-9,后接 9 位数字)注意:量词默认是 “贪婪匹配”,加。(仅匹配纯中文,不包含字母、数字等)变为 “非贪婪匹配”(如。匹配最短的连续 "a")。
2025-11-06 21:20:21
714
原创 Linux常用命令大全
find /home/user1 -name '*.txt' | xargs cp -av --target-directory=/home/backup/ --parents 从一个目录查找并复制所有以 '.txt' 结尾的文件到另一个目录。mkisofs -J -allow-leading-dots -R -V "Label CD" -iso-level 4 -o ./cd.iso data_cd 创建一个目录的iso镜像文件。
2025-11-06 21:18:19
426
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅