前端中常见的设计模式

1.单例模式

描述:保证一个类仅有实例,并提供一个可以全局访问他的点,它通常用于管理应用程序的全局状态或资源,例如一个唯一的状态管理器。

代码示例:

class Singleton {constructor() {if (!Singleton.instance) {Singleton.instance = this;}return Singleton.instance;}
}
const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true

2. 观察者模式

描述:观察者模式用于建立对象之间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖它的对象都会得到通知。在前端中,常见于事件处理和数据变化监听。

代码示例

class Observable {constructor() {this.observers = [];}addObserver(observer) {this.observers.push(observer);}notifyObservers(data) {this.observers.forEach(observer => observer.update(data));}
}class Observer {update(data) {console.log(`Received data: ${data}`);}
}const subject = new Observable();
const observer1 = new Observer();
const observer2 = new Observer();subject.addObserver(observer1);
subject.addObserver(observer2);subject.notifyObservers("Hello, observers!");

3. 工厂模式(Factory Pattern):

描述:工厂模式用于通过一个共同的接口来创建对象,隐藏了对象的创建细节。在前端中,可以用于创建不同类型的UI组件。

代码示例

class Button {render() {console.log("Rendering a button");}
}
class Input {render() {console.log("Rendering an input");}
}class UIFactory {create(type) {switch (type) {case "button":return new Button();case "input":return new Input();default:throw new Error("Invalid type");}}
}const factory = new UIFactory();
const button = factory.create("button");
const input = factory.create("input");button.render(); // Logs: "Rendering a button"
input.render();  // Logs: "Rendering an input"

4. 装饰者模式

描述:装饰者模式用于动态地将责任添加到对象上,以扩展对象的功能。在前端中,可以用于增强组件的功能。
代码示例:

class Component {operation() {console.log("Basic operation");}
}class Decorator {constructor(component) {this.component = component;}operation() {console.log("Decorator operation");this.component.operation();}
}const component = new Component();
const decoratedComponent = new Decorator(component);component.operation();         // Logs: "Basic operation"
decoratedComponent.operation(); // Logs: "Decorator operation" followed by "Basic operation"

5.策略模式

描述:策略模式定义了一系列算法,并将每个算法封装起来,使得它们可以互相替换。在前端中,可以用于处理不同的数据转换、验证或处理逻辑。
代码示例

class PaymentStrategy {constructor(paymentMethod) {this.paymentMethod = paymentMethod;}pay(amount) {return this.paymentMethod.pay(amount);}
}class CreditCardPayment {pay(amount) {console.log(`Paying ${amount} using credit card.`);}
}class PayPalPayment {pay(amount) {console.log(`Paying ${amount} using PayPal.`);}
}const creditCardPayment = new PaymentStrategy(new CreditCardPayment());
creditCardPayment.pay(100); // Logs: "Paying 100 using credit card."const payPalPayment = new PaymentStrategy(new PayPalPayment());
payPalPayment.pay(50); // Logs: "Paying 50 using PayPal."

6. 适配器模式

描述:适配器模式用于将一个类的接口转换成客户端期望的另一个接口。在前端中,可以用于处理不同数据格式或API之间的适配。
代码示例

class OldApi {request() {return "Response from old API";}
}class NewApi {fetch() {return "Response from new API";}
}class Adapter {constructor(api) {this.api = api;}request() {if (this.api instanceof OldApi) {return this.api.request();} else if (this.api instanceof NewApi) {return this.api.fetch();}}
}const oldApi = new OldApi();
const newApi = new NewApi();const oldAdapter = new Adapter(oldApi);
console.log(oldAdapter.request()); // Logs: "Response from old API"const newAdapter = new Adapter(newApi);
console.log(newAdapter.request()); // Logs: "Response from new API"

7. 命令模式

描述:命令模式将请求或操作封装成对象,允许参数化调用。在前端中,可以用于处理用户操作、撤销/重做功能等。
代码描述:

class Command {constructor(receiver) {this.receiver = receiver;}execute() {this.receiver.performAction();}
}class Receiver {performAction() {console.log("Action performed");}
}const receiver = new Receiver();
const command = new Command(receiver);command.execute(); // Logs: "Action performed"

8. 代理模式

描述: 代理模式控制对其他对象的访问,可以添加额外的逻辑,如缓存、权限控制等。在前端中,可以用于懒加载、请求缓存等场景。
代码描述

class RealImage {constructor(filename) {this.filename = filename;this.loadImageFromDisk();}display() {console.log(`Displaying image: ${this.filename}`);}loadImageFromDisk() {console.log(`Loading image: ${this.filename}`);}
}class ProxyImage {constructor(filename) {this.filename = filename;this.realImage = null;}display() {if (!this.realImage) {this.realImage = new RealImage(this.filename);}this.realImage.display();}
}const image1 = new ProxyImage("image1.jpg");
image1.display(); // Logs: "Loading image: image1.jpg" followed by "Displaying image: image1.jpg"
image1.display(); // Logs: "Displaying image: image1.jpg" (no additional loading)const image2 = new ProxyImage("image2.jpg");
image2.display(); // Logs: "Loading image: image2.jpg" followed by "Displaying image: image2.jpg"

9. 迭代器模式

描述:迭代器模式提供一种顺序访问聚合对象元素的方法,而无需暴露其内部表示。在前端中,可以用于遍历数据集合。
代码描述:

class Iterator {constructor(collection) {this.collection = collection;this.index = 0;}hasNext() {return this.index < this.collection.length;}next() {return this.collection[this.index++];}
}const collection = [1, 2, 3, 4, 5];
const iterator = new Iterator(collection);while (iterator.hasNext()) {console.log(iterator.next());
}

10. 状态模式

描述:状态模式允许对象在内部状态变化时改变其行为。在前端中,可以用于管理复杂的UI状态转换。
代码描述

class State {handle() {console.log("Default state handling");}
}class ConcreteStateA extends State {handle() {console.log("State A handling");}
}class ConcreteStateB extends State {handle() {console.log("State B handling");}
}class Context {constructor() {this.state = new State();}setState(state) {this.state = state;}request() {this.state.handle();}
}const context = new Context();
context.request(); // Logs: "Default state handling"context.setState(new ConcreteStateA());
context.request(); // Logs: "State A handling"context.setState(new ConcreteStateB());
context.request(); // Logs: "State B handling"

其他

  1. 模板方法模式:模板方法模式定义了一个算法的骨架,允许子类为其中的步骤提供具体实现。在前端中,可以用于创建可定制的UI组件。
  2. 组合模式:组合模式将对象组合成树状结构,以表示部分-整体的层次关系。在前端中,可以用于处理UI组件的嵌套结构。
  3. 备忘录模式:备忘录模式用于捕获对象的内部状态,并在需要时进行恢复。在前端中,可以用于实现撤销/重做功能或保存应用状态。
  4. 访问者模式:访问者模式用于在不改变元素类的情况下,为元素添加新的操作。在前端中,可以用于遍历并处理复杂的DOM结构或数据结构。
  5. 责任链模式:责任链模式将请求的发送者和接收者解耦,形成一个链条,并将请求沿着链条传递,直到有一个接收者能够处理它。在前端中,可以用于处理用户输入、事件处理等场景。
  6. 桥接模式:桥接模式用于将抽象部分与其实现部分分离,使它们可以独立变化。在前端中,可以用于处理不同平台或不同样式的渲染。
  7. 解释器模式:解释器模式用于定义语言的文法,并解释语言中的表达式。在前端中,可以用于处理自定义的模板语言或表达式。
  8. 享元模式:享元模式用于共享细粒度对象,以减少内存占用。在前端中,可以用于管理大量的相似对象,例如优化渲染性能。
  9. 合成模式:合成模式用于将对象组合成树状结构,以表示“整体-部分”的层次关系。在前端中,可以用于构建复杂的UI组件层次结构。
  10. 外观模式:外观模式提供了一个简化的接口,用于访问复杂子系统中的功能。在前端中,可以用于封装复杂的API调用,以提供更简洁的接口。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/29091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础类】—前端算法类

一、排序 1. 排序方法列表 2. 常见排序方法 快速排序选择排序希尔排序 二、堆栈、队列、链表 堆栈、队列、链表 三、递归 递归 四、波兰式和逆波兰式 理论源码

机器学习笔记之优化算法(十一)梯度下降法:凸函数VS强凸函数

机器学习笔记之优化算法——梯度下降法&#xff1a;凸函数VS强凸函数 引言凸函数&#xff1a;凸函数的定义与判定条件凸函数的一阶条件凸函数的梯度单调性凸函数的二阶条件 强凸函数强凸函数的定义强凸函数的判定条件强凸函数的一阶条件强凸函数的梯度单调性强突函数的二阶条件…

redis的主从复制,哨兵和cluster集群

目录 一、redis的高可用 1&#xff09;redis高可用的概念 2&#xff09;Redis的高可用技术 二、redis主从复制 1&#xff09;主从复制的作用 2&#xff09;主从复制流程 三、redis一主二从的部署 实验组件 实验步骤 环境准备 修改内核参数 安装 Redis 创建redis工…

前后端分离式项目架构流程复盘之宿舍管理系统

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;【&#x1f387;前端】先创建Vue-cli项目&#xff08;版本2.6.10&#xff0c;仅包含babel&#xff09;&#xff0c;请选择此项目并创建 【整理简化项目模板】【&#x1f380;创建路由】…

k8s 终止pod

cat test.yaml apiVersion: v1 #必选&#xff0c;版本号&#xff0c;例如v1 kind: Pod #必选&#xff0c;Pod metadata: #必选&#xff0c;元数据 name: string #必选&#xff0c;Pod名称 namespace: string #必选&#xff0c;Pod所属的命…

git clean 命令

git clean -n //显示要删除的文件&#xff0c;clean的演习&#xff0c;告诉哪些文件删除&#xff0c;只是一个提醒。 git clean -dn //显示要删除的文件和目录 git clean -f //删除未追踪的文件 git clean -dff //删除未追踪的目录 git clean -df //清除所有未跟踪文件&#xf…

缩略图更清晰了:imagecopysampled代替imagecopyresized

之前用 imagecopyresized() 生成缩略图,但是效果不是太理想,后来把 imagecopyresized() 换成 imagecopysampled() ,效果好太多了,图片变得更加清晰了。 通过对比图,很明显看出,imagecopysampled()生成的缩略图,清晰度高很多。 下面是imagecopysampled()生成缩略图的代…

Netty面试题1

计算机网络模型 OSI采用了分层的结构化技术&#xff0c;共分七层&#xff0c; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 Open System Interconnect 简称OSI&#xff0c;是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统互连参…

互联网医院|线上医疗平台连接医者和患者的桥梁

近年来&#xff0c;随着互联网技术的飞速发展&#xff0c;互联网医院系统悄然崛起&#xff0c;引领着医疗行业的变革浪潮。这一系统以其出色的功能与服务&#xff0c;为广大患者带来了便捷、高效的医疗体验&#xff0c;将传统医疗模式推向了新的高度。 作为医疗界的新生力量&a…

c# 初始化列表,并给列表里面所有的元素进行初始化

Enumerable.Repeat 方法是用于生成一个包含指定元素重复若干次的序列。它接受两个参数&#xff0c;第一个参数是要重复的元素&#xff0c;第二个参数是重复次数。 下面是 Enumerable.Repeat 方法的用法和示例&#xff1a; using System; using System.Collections.Generic; u…

nginx中的location匹配与重定向

location匹配有三种方法&#xff1a;完全匹配&#xff0c;正则匹配&#xff0c;通用匹配。 精确匹配&#xff1a;location / { ... } 正则匹配&#xff1a;location - / { ... } 一般匹配&#xff1a;location / { ... } location通过uri来匹配资源。uri&#xff1a;统一资源…

FFmpeg常见命令行(三):FFmpeg转码

前言 在Android音视频开发中&#xff0c;网上知识点过于零碎&#xff0c;自学起来难度非常大&#xff0c;不过音视频大牛Jhuster提出了《Android 音视频从入门到提高 - 任务列表》。本文是Android音视频任务列表的其中一个&#xff0c; 对应的要学习的内容是&#xff1a;如何使…

七月学习总结

一晃暑期七月份已经结束了&#xff0c;八月份需要做的事情更多。 在成长的路上不断地迷茫&#xff0c;不断地前进。到底才能完成对自己地救赎。 目前想的就是以后走软件开发&#xff0c;往架构方向做&#xff0c;主语言Java或者go&#xff0c;408基础一定要扎实&#xff0c;计…

新型网络安全:从过程到明确结果

内容 过去的情况网络安全是理论性的&#xff0c;结果才是实际性的。这可能吗&#xff1f;我们现在的努力方向结论 本文讲述了为什么企业必须重新思考其网络安全方法&#xff1a;旧方法是否足够有效&#xff0c;是否可以完全适用&#xff1f;公司应采取哪些行动来实现内部信息…

【LeetCode】【数据结构】单链表OJ常见题型(二)

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言&#xff1a; 【LeetCode】面试题02.04. 分割链表 【Lee…

微信小程序申请步骤

微信公众平台链接&#xff1a;https://mp.weixin.qq.com/ 1、进到微信公众平台&#xff0c;点一下“点击注册”&#xff0c;挑选账号申请种类“小程序”&#xff0c;填好微信小程序用户信息&#xff0c;包含电子邮箱、登陆密码等。 2、微信公众平台会发送一封电子邮件&#xf…

Android WebView简单应用:构建内嵌网页浏览功能

在现代移动应用开发中&#xff0c;内嵌网页浏览功能是许多应用程序的常见需求。Android平台提供了WebView组件&#xff0c;它允许开发者将网页内容嵌入到应用中&#xff0c;并提供了丰富的功能和定制选项。本文将介绍如何在Android应用中使用WebView组件&#xff0c;帮助您快速…

Web3 solidity编写交易所合约 编写ETH和自定义代币存入逻辑 并带着大家手动测试

上文 Web3 叙述交易所授权置换概念 编写transferFrom与approve函数我们写完一个简单授权交易所的逻辑 但是并没有测试 其实也不是我不想 主要是 交易所也没实例化 现在也测试不了 我们先运行 ganache 启动一个虚拟的区块链环境 先发布 在终端执行 truffle migrate如果你跟着我…

# ⛳ Docker 安装、配置和详细使用教程-Win10专业版

目录 ⛳ Docker 安装、配置和详细使用教程-Win10专业版&#x1f69c; 一、win10 系统配置&#x1f3a8; 二、Docker下载和安装&#x1f3ed; 三、Docker配置&#x1f389; 四、Docker入门使用 ⛳ Docker 安装、配置和详细使用教程-Win10专业版 &#x1f69c; 一、win10 系统配…

ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作

本次介绍【划分】工具的使用&#xff0c;如下所示&#xff0c;为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】&#xff1a;其操作如下所示&#xff0c;其中&#xff1a; 1表示先选中待处理的图斑&#xff0c;2…