js装饰器模式

devtools/2025/1/11 13:47:31/

装饰器模式是一种结构型设计模式,它允许你在不改变对象结构的情况下,动态地给对象添加新的行为或职责。
装饰器模式通过创建一个装饰器类,来包装原始对象,并在不改变原始对象的基础上,为其添加新的功能。装饰器类和原始对象实现相同的接口,因此可以互相替换
优点是可以在不改变原始对象的情况下,动态地添加新的功能,从而提高代码的灵活性和可维护性。
同时,装饰器模式也可以避免在原始对象中添加过多的功能,从而提高代码的可读性和可维护性。
缺点是会增加代码的复杂性,并且可能会影响代码的性能。因此,在使用装饰器模式时,需要谨慎考虑,并根据具体情况选择合适的设计模式。

在这里插入图片描述

运用

设我们的初始需求是:每个业务中的按钮在点击后都弹出「您还未登录哦」的弹窗。
产品经理说这个弹窗提示还不够明显,我们应该在弹窗弹出后把按钮的文案改为“快去登录”,同时把按钮置灰。

  <body><div class="box"><button id="open">打开弹窗</button><button id="close">关闭弹窗</button></div><script>//源代码const open = document.getElementById('open')const close = document.getElementById('close')const box = document.querySelector('.box')const Modal = (function () {let instance = nullreturn () => {if (!instance) {instance = document.createElement('div')instance.innerHTML = '内容'instance.className = 'modal'instance.style.display = 'none'box.appendChild(instance)}return instance}})()function openModal() {const modal = Modal()modal.style.display = "block"}class OpenBtn {onClick() {const modal = Modal()modal.style.display = "block"}}class Decorator {constructor(openBtn) {this.openBtn = openBtn}onClick() {//旧逻辑this.openBtn.onClick()//新逻辑this.changeBtn()}changeBtn() {open.innerText = '快去登录'open.setAttribute('disabled', true)}}const openBtn = new OpenBtn()const decorator = new Decorator(openBtn)open.addEventListener('click', () => {decorator.onClick()})</script></body>

装饰器语法糖

// 装饰器函数,它的第一个参数是目标类
function classDecorator(target) {target.hasDecorator = truereturn target
}// 将装饰器“安装”到Button类上
@classDecorator
class Button {// Button类的相关逻辑
}// 验证装饰器是否生效
console.log('Button 是否被装饰了:', Button.hasDecorator)

http://www.ppmy.cn/devtools/149624.html

相关文章

【Linux】gawk编辑器

一、基本介绍 相较于sed编辑器来说&#xff0c;gawk提供了一种编程语言&#xff0c;而不仅仅是编辑器命令。 在gawk编程语言中&#xff0c;可以实现以下操作&#xff1a; 定义变量来保存数据&#xff1b;使用算术和字符串运算符来处理数据&#xff1b;使用结构化编程语法&…

自动化巡检系统如何提高运维效率?

一、自动化巡检系统简介 &#xff08;一&#xff09;定义与基本原理 自动化巡检系统是一种借助先进的信息技术&#xff0c;旨在对各类系统进行高效、精准监测的智能化工具。它主要依靠预设的脚本、专业的监测工具以及相关的软件模块&#xff0c;按照既定的规则和流程&#xff0…

Wireshark编译手册(Windows)

以下是对 Wireshark 官方文档中“Windows 平台的设置和构建说明”部分的翻译和总结&#xff1a; 2.2. Windows 平台 本节提供了在 Windows 上进行 Wireshark 开发的快速设置指南&#xff0c;包含推荐的配置。 2.2.1. 使用 Microsoft Visual Studio 注意&#xff1a;除非您非…

Jenkins内修改allure报告名称

背景&#xff1a; 最近使用Jenkins搭建自动化测试环境时&#xff0c;使用Jenkins的allure插件生成的报告&#xff0c;一直显示默认ALLURE REPORT&#xff0c;想自定义成与项目关联的名称&#xff0c;如图所示&#xff0c;很明显自定义名称显得高大上些&#xff0c;之前…

Python 模块 Uvicorn 实战指南

文章目录 1. 介绍和安装1.1 介绍1.2 安装 2. 创建基础应用2.1 简单的 HTTP 应用2.2 添加日志 3. 实现高级功能3.1 支持 WebSocket3.2 优化运行性能 4. Nginx 配置反向代理4.1 安装与配置 Nginx4.2 启用 SSL 支持4.3 性能优化建议 5. 常见问题与解决方案5.1 高并发问题5.2 WebSo…

ETL的工作原理

ETL的工作原理 什么是ETL_云计算主题库-阿里云 ETL的工作原理可以分为三个主要的步骤&#xff1a;Extract&#xff08;提取&#xff09;、Transform&#xff08;转换&#xff09;、Load&#xff08;加载&#xff09;。 工作步骤 描述 Extract &#xff08;提取&#xff09;…

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase&#xff0c;在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗&#xff1f; 内部存储: 当使用 Room 创建数据库&#xff08;如 DemoDatabase&#xff09;&#xff0c;数据库文件通常…

nginx运行之后显示的是上一个项目,如何解决

重启 Nginx 使配置生效 修改 Nginx 配置后&#xff0c;你需要重新加载或重启 Nginx&#xff0c;以使配置生效。执行以下命令&#xff1a; sudo nginx -t # 测试配置是否正确 sudo systemctl restart nginx # 重启 Nginxbash 复制代码 检查浏览器缓存 浏览器可能缓存了旧…