前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >JS常用的几种设计模式

JS常用的几种设计模式

作者头像
Maic
发布于 2022-12-21 11:21:08
发布于 2022-12-21 11:21:08
80200
代码可运行
举报
文章被收录于专栏:Web技术学苑Web技术学苑
运行总次数:0
代码可运行

面试常常问到设计模式,设计模式在实际业务中即使有用到,但是依然感受不到它的存在,往往在框架中会有更多体现,比如vue2源码,内部还是有很多设计思想,比如观察者模式,模版模式等,我们在业务上一些通用的工具类也会用到单例,在大量的条件判断也会考虑策略者模式,这两种用得比较多。好记性不如烂笔头,又重新回顾了一遍设计模式,虽然仅仅掌握了几种熟悉的设计模式,但是希望在复杂的业务上,能想起那些不太常用的设计模式。

正文开始...

  • 单例模式

这种在业务里用得最多,常常是暴露一个全局的实例,或者是一个全局的类,所有的方法都是私有的,只能通过类访问内部方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

function Single () {
  if (!Single.instance) {
		  Single.instance = this;
  }
  return Single.instance
}
const a = new Single()
const b = new Single()
 // a === b; true
  • 策略者模式

我们通常在多个条件时,我们会考虑对象或者Map方式去替代我们的if条件,这是业务代码里常用的一种方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const obj = {
  a: function() {},
  b: function() {}
}

const fn = (target) => {
	return (key) => target[key]()
}
const geta = fn(obj)('a');
const getb = fn(obj)('b');
  • 工厂模式

相似的对象,不知道应该用哪一种,根据输入的参数,自行决定创建指定类型的对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var myApp = {};
myApp.dom = {};
myApp.dom.text = function(url) {
	this.url = url;
  this.insert = function(dom) {
	  const text = document.createTextNode(this.url);
		dom.appendChild(text);
	}
}
myApp.dom.img = function(url) {
	this.url = url;
  this.insert = function(dom) {
	  const img = document.createElement('image');
    img.src = this.url;
		dom.appendChild(img);
	}
}
const textObj = new myApp.dom.text('http://www.learn.wmcweb.cn');
textObj.insert(document.body);

const imgObj = new myApp.dom.img('http://www.learn.wmcweb.cn')
imgObj.insert(document.body);

我们可以通过一个中间函数,通过形参去确定哪个对象

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

myApp.dom.factor = function(type, url) {
  return new myApp.dom[type](url)
}
const imgfator = myApp.dom.factor('img', 'http://www.learn.wmcweb.cn')
const textFator = myApp.dom.factor('text', 'http://www.learn.wmcweb.cn')
imgfator.insert(document.body);
textFator.insert(document.body)
  • 装饰器模式

它是一种结构模型,与对象创建无关,如何拓展对象的功能

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var person = {};
person.say = function() {
   this.nowTime = function() {
	  console.log('nowTime');
   }
}
person.sleep = function() {
  this.curentTime = function() {
     console.log('this is current time');
   }
}
person.getFn = function(type) {
  person[type].prototype = this;
  return new person[type]
}
person = person.getFn('say');

console.log(person.nowTime()) // ok
console.log(person.curentTime()) // 报错

如果你像下面这样,就ok了。当你person.getFn('sleep')执行时就扩展了对象的功能,能访问绑定在自身属性属性的curentTime方法了,但是你会发现,此时也可以访问nowTime方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

person = person.getFn('say');
person = person.getFn('sleep');
console.log(person.nowTime()) // ok
console.log(person.curentTime()) // ok
  • 观察者模式【发布订阅模式】

是一种行为模式,主要用于不同对象之间的交互信息

发布对象:重要事情发生时,会通知订阅者

订阅对象:监听发布对象的通知,并做出相应的反应

观察者主要分为两类:推送模式和拉动模式

推送模式是由发布者负责将消息发送给订阅者

拉动模式是订阅者主动跟踪发布者的状态变化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var observer = {};
observer.list = []; // 存放订阅者的回调函数

// 创建发布者
observer.trigger = function() {
  this.list.forEach(fn => {
	   fn.apply(this, arguments)
	})
}
// 创建订阅者
observer.addLinsten = function(fn) {
   this.list.push(fn)
}

observer.addLinsten(function(week, msg) {
		console.log(`今天${week}, ${msg}`)
})
observer.addLinsten(function(week, msg) {
		console.log(`今天${week}, ${msg}`)
})

observer.trigger('周末', '不上班')
  • 命令模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var btnClick = function(btn,callback) {
  btn.onclick = callback;
}
const modal = {
  open: function() {
	    console.log('open');
  },
  close: function() {
		console.log('close');
  }
}
btnClick(document.getElementById('app'), modal.open)
btnClick(document.getElementById('app'), modal.close)
  • 模版模式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var Table = function() {}
Table.prototype.drawHeader = function() {}
Table.prototype.drawBody = function() {}
Table.prototype.init = function() {
   this.drawHeader();
   this.drawBody();
}
const createTable = new Table();
createTable.init();

如果还有一个类似的子类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

var subTable = function() {}
subTable.prototype = new Table();
const stable = new subTable();
stable.init(); 

我们再重新整合一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const DrawTable = function(params){
	const {drawHeader, drawBody} = params
  const F = function() {};
  F.prototype.init = function() {
	    drawHeader();
		drawBody();
      /*
         // or
         Object.keys(params).forEach(key => {
           params[key]();
         })
      */
	}
  return F
}
const table = new DrawTable({
	drawHeader() {
	console.log('header');	},
  drawBody() {
		console.log('body')
	}
});
table.init();
  • 适配器模式

通过一个统一的中间方法,做统一的适配调用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

const render = (obj) => {
   obj.start();
}
const airplane = {
   start() {
			console.log('飞机开始飞了')
   }
}
const car = {
   start() {
	   console.log('火车开始了');
   }
}

render(airplane)
render(car)
  • 高阶函数

参考《javascript设计与开发实践》,下面afterbefore的设计很令人深思

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

Function.prototype.before = function(beforeFn) {
   const self = this;
   return function() {
		   beforeFn.apply(this, arguments);// 先执行回调函数
       return self.apply(this, arguments) // 然后执行原函数
    }
}
Function.prototype.after = function(afterFn) {
	const self = this;
  return function() {
		const ret = self.apply(this, arguments);
    afterFn.apply(this, arguments); // 执行当前的回调函数
    return ret;
  }
}
var func = function () {
	  console.log(2)
}
func = func.before(()=> {
	console.log(1)
}).after(() => {
	console.log(3)
});
func(); // 1,2,3

《javascript设计与开发实践》中也有很多其他模式,比如代理模式,中介者模式,状态模式等,很多的设计模式实际上在业务代码里并不会用到,在某些特殊业务场景这些设计模式的思想会大大增强我们代码的拓展性,但过度的设计模式也会带来一定的阅读负担,凡事不可追求两全其美,只需要适可而止。

总结

  • 常用的设计模式,比如说单例模式,单例就是只对外暴露一个实例,所有的内部方法都是通过这个实例访问
  • 策略者模式是一种多条件的优化模式,当你在条件判断很多时,可以考虑策略者模式
  • 工厂模式,主要通过一个中间函数,通过形参输出对应的对象
  • 装饰器模式,主要是扩展对象的多个功能能力
  • 观察者模式也是发布订阅模式,主要有发布对象与订阅对象,订阅者监听发布对象的通知,做出响应,发布对象是有重要通知,统一通知所有订阅者
  • 另外看到一个利用闭包实现一个函数的before,after的例子
  • 本文示例主要参考《javascript设计与开发实践》《javascript面向对象编程指南(第二版)》

最后,看完觉得有收获的,点个赞,在看,转发,收藏等于学会,欢迎关注Web技术学苑,好好学习,天天向上!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Web技术学苑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
签证原因无法参加ICLR 2019,研究者请愿不在美国举办CS大会
随着人工智能热度持续增加,来自全球各地的研究科学家都在积极参与学术会议。近几年,CVPR、NeurIPS 这样的顶级会议每年都能吸引到 5000-8000 人参会。
机器之心
2019/05/14
9860
签证原因无法参加ICLR 2019,研究者请愿不在美国举办CS大会
尖端AI学术会议NIPS改名风波:拒绝性别歧视
在AI和机器学习领域最重要的会议之一:神经信息处理系统大会(NIPS)目前正在考虑更改其名称,部分原因是首字母缩略词的内涵具有性别歧视意味,主要针对英语使用者。在几次公开呼吁更改名称后,大会于4月份宣布他们正在考虑更改名称,并很快就此事向社群进行咨询。
AiTechYun
2018/08/16
5310
尖端AI学术会议NIPS改名风波:拒绝性别歧视
在哈佛的一场闭门会上,专家说全球各国都应设置“人工智能部长”
原文刊载于 Futurism 维金 编译整理 量子位 出品 | 公众号 QbitAI 本周,全球各国的行业领导者参加了一场关于全球范围内人工智能监管的闭门会议。与会者包括50多名全球最主要的人工智能专
量子位
2018/03/21
5020
在哈佛的一场闭门会上,专家说全球各国都应设置“人工智能部长”
机器学习中的女性:改变人工智能的面貌
机器学习女性大会(Women in Machine Learning Conference)在过去10年里一直是一个非常重要的网络,将计算机科学领域的女性少数群体连接到一起。 而这个想法诞生在一个酒店房间里。 2005年,机器学习研究员Hanna Wallach参加NIPS大会时,发现自己竟然被安排和几名女性同行住在一间房。自2001年以来,Wallach一直在机器学习领域工作,参加了许许多多的大会。但这还是她第一次与研究机器学习的女性同住。机器学习作为一门学科,其研究人员绝大多数都是男性。据Wallach
新智元
2018/03/23
7530
机器学习中的女性:改变人工智能的面貌
Google大牛涉嫌性骚扰被停职,NIPS官方致歉,传闻多时的AI圈黑幕终于被撕开
编译 | reason_W 【营长有话说】今天的话题,噱头的外表下,有点沉重。营长此前也采访过众多学术界和工业界的领军人物,他们学识渊博,为人师表,谈吐之间是胸有诗书气自华的涵养与豁达,也有家国天下的豪气万丈与当仁不让。可是,在营长如此敬仰的学术圈与顶级科技公司,竟然屡屡发生性骚扰事件,这是在用学术和职位的权利表达“女性不过是附庸,不用太尊重”的隐含意义吗?这是因为社会给了他们太多的期待,捧得太高,造就的心理优越感吗?这就是被给予敬仰的精英阶层的自我修养吗? 有人的地方就有江湖,人性有着最不可低估的原罪
AI科技大本营
2018/04/27
5430
Google大牛涉嫌性骚扰被停职,NIPS官方致歉,传闻多时的AI圈黑幕终于被撕开
被机器学习遗忘的大洲:非洲正尝试建立自己的“NeurIPS会议”
没有饥寒交迫的难民、连天的炮火或者龟裂的土地。这里最吸引人眼球的是一张张色彩斑斓的海报,标注出各类不同的机器学习系统,例如预测土壤营养,判断农民是否会偿还贷款,以及如何让自动驾驶汽车在开罗熙熙攘攘的街道上行驶。
大数据文摘
2019/10/15
4890
AI顶会正变身商展,会将不会,还NeurIPS、ICML本来面貌!
出去刷个牙回来就没了票,研究人员想参加参加不了,看热闹的外行人倒是挤来一堆。Poster Session 熙熙攘攘,但真正在谈论文的人却没有几个。Expo 行业展厅花枝招揽,企业酒会觥筹交错……
新智元
2018/12/29
8090
计算机视觉相关会议、期刊简介
ICCV 的全称是 IEEE International Conference on Computer Vision,即国际计算机视觉大会,由IEEE主办,与计算机视觉模式识别会议(CVPR)和欧洲计算机视觉会议(ECCV)并称计算机视觉方向的三大顶级会议,被澳大利亚ICT学术会议排名和中国计算机学会等机构评为最高级别学术会议,在业内具有极高的评价。不同于在美国每年召开一次的CVPR和只在欧洲召开的ECCV,ICCV在世界范围内每两年召开一次。ICCV论文录用率非常低,是三大会议中公认级别最高的。ICCV会议时间通常在四到五天,相关领域的专家将会展示最新的研究成果。该会议由美国电气和电子工程师学会(IEEE,Institute of Electrical & Electronic Engineers)主办,主要在欧洲、亚洲、美洲的一些科研实力较强的国家举行。作为世界顶级的学术会议,首届国际计算机视觉大会于1987年在伦敦揭幕,其后两年举办一届。
Natalia_ljq
2020/06/03
1.4K0
疫情肆虐下,中国顶尖学者跨时区“云参与”AAAI大会,多场国际技术峰会受影响
2月7日开始,今年首个全球顶级人工智能峰会AAAI将在美国纽约召开。由于冠状病毒及美国禁令,约800位来自中国大陆的与会者将无法出席这次会议,包括首位AAAI华人主席、香港科技大学教授杨强。
大数据文摘
2020/02/21
5760
KDD 2018 的首个「深度学习日」,要让数据挖掘会议更「纯粹」
AI 科技评论按:深度学习近年来对数据科学产生了革命性的影响。基于计算能力的提升、数据来源的延展及编程框架的进步,深度神经网络已经无处不在。目前深度学习的相关方法在如计算机视觉、语音识别及生成、自然语言处理等多个领域取得了领先进展,也正在将它的应用领域延展至其它研究当中,取得更大的应用优势。
AI科技评论
2018/09/21
4880
KDD 2018 的首个「深度学习日」,要让数据挖掘会议更「纯粹」
2018年机器学习和数据科学重要会议概览
来源:KDnuggets 编译:Bing 一月 美洲 BAFI 2018:金融和工业商业分析第三次会议(3rd Conf. on Business Analytics in Finance and Industry) 时间:1月17日—19日 地点:智利,圣地亚哥 简介:BAFI 2018希望将数据科学及相关领域的研究者和开发者聚集在一起,将各自的技术应用于不同的领域,以推动学术交流与合作。明年,BAFI将重点关注在大数据集中提取信息的方法论发展,以及金融、零售和电信等
企鹅号小编
2018/01/16
1.5K0
2018年机器学习和数据科学重要会议概览
盘点52个全球人工智能和机器学习重要会议
选自Data Pipeline 机器之心编译 机器学习和人工智能是今天最热门的科技研究方向。随着行业的不断升温,越来越多的 AI 主题会议也层出不穷,在这些会议中,我们可以讨论近期技术的发展趋势,并与其他数据科学家、开发者与工业界人士交流意见。不管你是想时刻紧跟潮流,还是仅仅希望稍微了解一下人工智能,全世界每时每刻总有一个大会在等着你(比如后天即将开幕的 NIPS 2017)。本文将向你简要介绍 50 余场著名全球人工智能大会。 Notes:本文盘点未收录 CVPR、ACL、ICLR 和 EMNLP 等计算
机器之心
2018/05/09
1.3K0
盘点52个全球人工智能和机器学习重要会议
禁止与华为讨论技术标准?高通、英特尔3GPP上限制员工交流
据路透社报道,由于美国近期针对中国科技公司的黑名单事件,全球一些最大的科技公司正要求其员工不得私下与华为员工讨论技术和技术标准的相关问题。
机器之心
2019/06/14
4310
禁止与华为讨论技术标准?高通、英特尔3GPP上限制员工交流
会议整理 | 2023年度国内外图像图形学术会议
2023年第二届云计算、计算机视觉和图像处理亚洲会议(3CVIP 2023)将于2023年3月17-19日在中国上海举行。它由国际应用计算学会(ISAC)和工程师技术协会(T.I.E.)赞助。
一点人工一点智能
2023/02/22
2.6K0
会议整理 | 2023年度国内外图像图形学术会议
全球顶级AI专家闭门会议:每个国家都该设“人工智能部长”
来源:Futurism 作者:张乾 【新智元导读】这个周末,来自IBM、Facebook、亚马逊以及联合国等全球50多位顶尖思想家、各级政府官员和AI参与者悄悄开了一场闭门会议,讨论了AI给人类社会带来的挑战,并试图寻找解决方案。会议并没有达成有成效的结果,但这有可能是全球共同治理人工智能的开端。 当人类不再是地球上最智慧的生物的时候,人们的担忧就开始了。 这个周末,一个人关于工智能全球治理的闭门会议悄悄召开,会上聚集了包括IBM、Facebook、亚马逊以及联合国等全球50多位顶尖思想家、各级政府官员和A
新智元
2018/03/20
7540
全球顶级AI专家闭门会议:每个国家都该设“人工智能部长”
史上最全人工智能和机器学习会议大盘点
大名鼎鼎的神经信息处理系统大会(Neural Information Processing
IT阅读排行榜
2018/08/17
1.6K0
史上最全人工智能和机器学习会议大盘点
20190707
(注:该文计划发布到DDD China知乎,看看译文哪里不太通顺?该书电子版可以在这里免费购买,只要把价格滚轮拨到0即可。)
程序员吾真本
2019/07/09
6360
重要通知:动物森友会首届「AI 顶会」ACAI 2020即将召开
众所周知,因为疫情的原因,ICML、ICLR、CVPR 等人工智能顶级会议都已经改为了线上举办。
机器之心
2020/05/06
7930
史上首个线上 AI 顶会 ICLR 2020 结束,参会者数量翻番:仿佛看到了未来
人人都是云参会,因为新冠疫情被迫线上举行的 ICLR 2020 成为了历届规模最大的会议,参加人数暴增了一倍。
机器之心
2020/05/19
2970
史上首个线上 AI 顶会 ICLR 2020 结束,参会者数量翻番:仿佛看到了未来
大会 | 第30届IROS正式开幕,深度学习当道的机器人会议都有什么精彩亮点?(多图)
AI科技评论按:2017年9月25日,全球机器人规模最大的学术会议之一、IROS(International Conference on Intelligent Robots and Systems,
AI科技评论
2018/03/14
8060
大会 | 第30届IROS正式开幕,深度学习当道的机器人会议都有什么精彩亮点?(多图)
推荐阅读
签证原因无法参加ICLR 2019,研究者请愿不在美国举办CS大会
9860
尖端AI学术会议NIPS改名风波:拒绝性别歧视
5310
在哈佛的一场闭门会上,专家说全球各国都应设置“人工智能部长”
5020
机器学习中的女性:改变人工智能的面貌
7530
Google大牛涉嫌性骚扰被停职,NIPS官方致歉,传闻多时的AI圈黑幕终于被撕开
5430
被机器学习遗忘的大洲:非洲正尝试建立自己的“NeurIPS会议”
4890
AI顶会正变身商展,会将不会,还NeurIPS、ICML本来面貌!
8090
计算机视觉相关会议、期刊简介
1.4K0
疫情肆虐下,中国顶尖学者跨时区“云参与”AAAI大会,多场国际技术峰会受影响
5760
KDD 2018 的首个「深度学习日」,要让数据挖掘会议更「纯粹」
4880
2018年机器学习和数据科学重要会议概览
1.5K0
盘点52个全球人工智能和机器学习重要会议
1.3K0
禁止与华为讨论技术标准?高通、英特尔3GPP上限制员工交流
4310
会议整理 | 2023年度国内外图像图形学术会议
2.6K0
全球顶级AI专家闭门会议:每个国家都该设“人工智能部长”
7540
史上最全人工智能和机器学习会议大盘点
1.6K0
20190707
6360
重要通知:动物森友会首届「AI 顶会」ACAI 2020即将召开
7930
史上首个线上 AI 顶会 ICLR 2020 结束,参会者数量翻番:仿佛看到了未来
2970
大会 | 第30届IROS正式开幕,深度学习当道的机器人会议都有什么精彩亮点?(多图)
8060
相关推荐
签证原因无法参加ICLR 2019,研究者请愿不在美国举办CS大会
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档