当前位置: 首页 > news >正文

JavaScript 设计模式之桥接模式

桥接模式

通过桥接模式,我们可以将业务逻辑与元素的事件解耦,也可以更灵活的创建一些对象

倘若我们有如下代码

const dom = document.getElementById('#test')// 鼠标移入移出事件
// 鼠标移入时改变背景色和字体颜色
dom.onmouseenter = function() { this.style.color = 'white'this.style.backgroundColor = 'black'
}// 鼠标移出时恢复背景色和字体颜色
dom.onmouseleave = function () {this.style.color = 'black'this.style.backgroundColor = 'white'
}

这里我们不难看出有部分代码是重复的,只是改变了字体颜色跟背景色,这耦合度就高起来了,我们可以是这样

const changeColor = (dom, color, val)=>{dom.style[color] = val
}
const dom = document.getElementById('#test')
dom.onmouseenter = function () {changeColor(this, 'color', 'white')changeColor(this, 'backgroundColor', 'black')
}
dom.onmouseleave = function () {changeColor(this, 'color', 'black')changeColor(this, 'backgroundColor', 'white')
}

继续优化

const changeColor = (dom, color, val)=>{dom.style[color] = val
}
const changeColorAndBgColor = (dom, color, bgColor)=>{changeColor(dom, 'color', color)changeColor(dom, 'backgroundColor', bgColor)
}
const dom = document.getElementById('#test')
dom.onmouseenter = function () {changeColorAndBgColor(this, 'white', 'black')
}
dom.onmouseleave = function () {changeColor(this, 'black', 'white')
}

多元化

在使用不同角色有相同公用的方法时可以使用这种多元化来处理

const Speed = (x, y) => {this.x = xthis.y = y
}
Speed.prototype.run = function () { console.log('first run')
}
// TODO:其他内容
const Color = color => {this.color = color
}
Color.prototype.draw = function () {console.log('first draw')
}
// TODO:其他内容
const Speak = word => {this.word = word
}
Speak.prototype.say = function () {console.log('first say')
}
// TODO:其他内容// 创建一个 球
const Ball = function (x, y, color) {this.speed = new Speed(x, y)this.color = new Color(color)
}
Ball.prototype.init = function () {this.speed.run()this.color.draw()
}// 创建一个人
const People = function (x, y, say) {this.speed = new Speed(x, y)this.speak = new Speak(say)
}
People.prototype.init = function () {this.speed.run()this.speak.say()
}
...

通过桥接灵活的创建一个对象,针对不同的对象处理不同的业务逻辑,更灵活处理差异

http://www.lryc.cn/news/300651.html

相关文章:

  • B3651 [语言月赛202208] 数组调整
  • MessageQueue --- RabbitMQ
  • WordPress作者页面链接的用户名自动变成16位字符串串插件Smart User Slug Hider
  • Nvidia 携手 RTX 推出的本地运行 AI 聊天机器人
  • 年假作业day2
  • HTML-多媒体嵌入-MDN文档学习笔记
  • openJudge | 距离排序 C语言
  • 【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)
  • [leetcode]买卖股票的最佳时机 (动态规划)
  • 隐函数的求导【高数笔记】
  • SG3225EEN晶体振荡器规格书
  • ESP8266 常用AT指令
  • esbuild 构建工具为什么很快?
  • 解决vscode报错,在赋值前使用了变量“XXX“
  • python自动定时任务schedule库的使用方法
  • 用机器学习方法重构期货商品板块
  • 51单片机项目(29)——基于51单片机的避障跟随小车
  • 人工智能学习与实训笔记(六):百度飞桨套件使用方法
  • Linux第一个小程序-进度条
  • YoloV8改进策略:Block改进|Mamba-UNet改进YoloV8,打造全新的Yolo-Mamba网络
  • 数据分析基础之《pandas(8)—综合案例》
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • define和typedef
  • SpringCloud之Nacos用法笔记
  • 【c++】拷贝构造函数
  • 17.3.1.2 曝光
  • 【Win10 触摸板】在插入鼠标时禁用触摸板,并在没有鼠标时自动启用触摸板。取消勾选连接鼠标时让触摸板保持打开状态,但拔掉鼠标后触摸板依旧不能使用
  • 排序算法---桶排序
  • FPGA_工程_基于rom的vga显示
  • 代码随想录算法训练营第31天|● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和