首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 函数式vs.面向对象:响应未知和不确定
02 | 如何通过闭包对象管理程序中状态的变化?
03 | 如何通过部分应用和柯里化让函数具象化?
04 | 如何通过组合、管道和reducer让函数抽象化?
05|map、reduce和monad如何围绕值进行操作?
06 | 如何通过模块化、异步和观察做到动态加载?
07 | 深入理解对象的私有和静态属性
08|深入理解继承、Delegation和组合
09|面向对象:通过词法作用域和调用点理解this绑定
10|JS有哪8种数据类型,你需要注意什么?
11|通过JS引擎的堆栈了解闭包原理
12|JS语义分析该用迭代还是递归?
13 | JS引擎如何实现数组的稳定排序?
14 | 通过SparkPlug深入了解调用栈
15 | 如何通过哈希查找JS对象内存地址?
16 | 为什么环形队列适合做Node数据流缓存?
17 | 如何通过链表做LRU/LFU缓存?
18 | TurboFan如何用图做JS编译优化?
19 | 通过树和图看如何在无序中找到路径和秩序
20 | 算法思想:JS中分治、贪心、回溯和动态规划
21 | 创建型:为什么说Redux可以替代单例状态管理
22|结构型:Vue.js如何通过代理实现响应式编程
23 | 结构型:通过jQuery看结构型模式
24 | 行为型:通过观察者、迭代器模式看JS异步回调
25 | 行为型:模版、策略和状态模式有什么区别?
26|特殊型:前端有哪些处理加载和渲染的特殊“模式”?
27|性能:如何理解JavaScript中的并行、并发?
28|性能:通过Orinoco、Jank Busters看垃圾回收
29|网络:从HTTP/1到HTTP/3,你都需要了解什么?
30|安全:JS代码和程序都需要注意哪些安全问题?
31|测试(一):开发到重构中的测试
32|测试(二):功能性测试
33|测试(三):非功能性测试
34|静态类型检查:ESLint语法规则和代码风格的检查
35|Flow:通过Flow类看JS的类型检查
36|包管理和分发:通过NPM做包的管理和分发
37|编译和打包:通过Webpack、Babel做编译和打包
38|语法扩展:通过JSX来做语法扩展
39|Polyfill:通过Polyfill让浏览器提供原生支持
40|微前端:从MVC贫血模式到DDD充血模式
41|大前端:通过一云多端搭建跨PC/移动的平台应用
42|元编程:通过Proxies和Reflect赋能元编程
当前位置:
首页>>
技术小册>>
JavaScript进阶实战
小册名称:JavaScript进阶实战
### 25 | 行为型:模版、策略和状态模式有什么区别? 在软件设计模式中,行为型模式主要关注对象之间的交互以及算法或任务在对象间的分配。它们通过定义对象之间的通信方式来增加系统的灵活性和可维护性。其中,模版方法模式、策略模式和状态模式是三种非常经典且广泛使用的行为型设计模式,它们各自在解决不同问题时展现出独特的优势。本章节将深入探讨这三种模式的定义、应用场景、实现方式,以及它们之间的核心区别。 #### 一、模版方法模式(Template Method Pattern) **定义**: 模版方法模式定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。模版方法模式的目的是通过定义一个操作中的算法的骨架,而将算法的一些步骤延迟到子类中。这样一来,可以在不改变算法结构的前提下,重新定义算法中的某些步骤。 **应用场景**: - 当需要在一个算法中固定操作序列,但某些步骤的具体实现可能因情况而异时。 - 当多个子类共享一个复杂的过程时,且该过程仅在少数几个点上有所不同。 **实现方式**: - 定义一个抽象类,该类中声明了算法的基本结构,即模版方法。 - 在抽象类中定义一些抽象方法,这些方法将在具体子类中实现。 - 在模版方法中调用这些抽象方法,以控制算法的执行流程。 **示例**: 假设我们要设计一个咖啡冲泡系统,冲泡流程大致相同(预热、加水、冲泡、倒入杯中),但不同类型的咖啡(如美式、拿铁、卡布奇诺)在冲泡细节上有所不同。此时,可以使用模版方法模式,定义一个冲泡的模版方法,而将具体的冲泡方式留给子类去实现。 #### 二、策略模式(Strategy Pattern) **定义**: 策略模式定义了一系列算法,并将它们一个个封装起来,使它们可以互相替换。此模式让算法的变化独立于使用算法的客户。 **应用场景**: - 当有多种算法实现同一个功能,且这些算法可以相互替换时。 - 当算法需要频繁地在不同场合以不同方式被使用时。 - 当一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现时。 **实现方式**: - 定义一个策略接口,用于封装所有支持的算法。 - 创建具体策略类,实现策略接口。 - 在客户端(Context)类中,使用策略接口引用,并可以根据需要动态地更换策略实现。 **示例**: 考虑一个排序系统,需要支持多种排序算法(如快速排序、归并排序、冒泡排序)。使用策略模式,可以定义一个排序接口,然后为每个排序算法创建一个具体的策略类。客户端可以根据需要选择不同的排序策略来执行排序操作。 #### 三、状态模式(State Pattern) **定义**: 状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 **应用场景**: - 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时。 - 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。 **实现方式**: - 为每个状态定义一个状态接口,由该接口规定对象在该状态下的行为。 - 创建具体状态类,实现状态接口,并在其中实现与状态相关的行为。 - 在环境(Context)类中维护一个状态对象的引用,并在状态改变时更新这个引用。 **示例**: 假设我们要设计一个交通信号灯系统,信号灯有三种状态:红灯、黄灯、绿灯,每种状态下信号灯的行为不同。使用状态模式,可以为每种状态定义一个状态类,并在环境类中根据当前状态调用相应的行为。 #### 四、模版方法、策略和状态模式的区别 1. **目的不同**: - **模版方法模式**:定义算法骨架,让子类实现算法的某些特定步骤。它关注于算法的整体结构不变,但允许具体步骤的变化。 - **策略模式**:定义一系列算法,并将它们封装起来,使它们可以互相替换。它关注的是算法的可替换性和灵活性。 - **状态模式**:根据对象的状态改变其行为。它关注的是对象内部状态与行为的对应关系。 2. **应用场景差异**: - 模版方法模式适用于算法结构固定,但具体实现可变的场景。 - 策略模式适用于多种算法实现同一功能,且这些算法可以相互替换的场景。 - 状态模式适用于对象行为随状态变化而变化的场景。 3. **实现方式差异**: - 模版方法模式通过抽象类和继承实现,子类重写父类中的抽象方法。 - 策略模式通过接口和具体策略类实现,客户端通过接口引用选择具体的策略实现。 - 状态模式通过状态接口和具体状态类实现,环境类根据当前状态调用相应的方法。 4. **关注点不同**: - 模版方法模式关注算法的整体框架和步骤的灵活性。 - 策略模式关注算法的多样性和可替换性。 - 状态模式关注对象状态与行为的对应关系,以及状态转换时行为的改变。 综上所述,模版方法模式、策略模式和状态模式虽然都属于行为型设计模式,但它们在目的、应用场景、实现方式和关注点等方面存在显著的差异。理解这些差异,有助于我们在实际开发中根据具体需求选择最合适的模式,从而设计出更加灵活、可维护的软件系统。
上一篇:
24 | 行为型:通过观察者、迭代器模式看JS异步回调
下一篇:
26|特殊型:前端有哪些处理加载和渲染的特殊“模式”?
该分类下的相关小册推荐:
经典设计模式Javascript版
零基础学JavaScript
剑指javascript
Javascript编程指南
剑指javascript-ES6
Flutter核心技术与实战
Node.js 开发实战
JavaScript面试指南
Javascript重点难点实例精讲(一)
ES6入门指南
编程入门课:Javascript从入门到实战
深入学习前端重构知识体系