js常见的设计模式一
1.观察者模式
定义一些一对多的关系,将一系列的观察者对目标函数感兴趣,将自己添加进目标函数,当目标函数状态发生改变时,发送通知,以此通知附加在目标上的观察者
/* 目标 */
class subject {
constructor () {
this.handlers = []
}
addhanler (fn) {
this.handlers.push(fn)
}
notity () {
this.handlers.forEach(hanlder=>{
hanlder.update()
})
}
}
/* 观察者 */
class observer {
constructor (name) {
this.name = name
}
update () {
console.log(this.name)
}
}
let sub = new subject(); sub.addhanler(new observer('czklove'))
sub.addhanler(new observer('czklove1'))
sub.addhanler(new observer('czklove2')) sub.notity()
2.发布订阅者模式
订阅者A和发布者B是通过中间件关联起来的,他们没有直接的交流
/*
pusher 为发布订阅者模式的中间件
相对于观察者模式对了一个中间件,观察者模式,目标是观察者联系紧密
而发布订阅者模式,发布者和订阅者完全没有关系
*/
let pusher = {
clentlist: {},
addhandler (key,fn) {
if(!this.clentlist[key]) {
this.clentlist[key] = []
}
this.clentlist[key].push(fn)
},
notify (key,...args) {
if(this.clentlist[key]) {
this.clentlist[key].forEach(hanlder=>{
hanlder(...args)
})
}
}
}
pusher.addhandler('click',(val)=>{
console.log('1'+val)
})
pusher.addhandler('click',(val)=>{
console.log('2'+val)
})
pusher.addhandler('click',(val)=>{
console.log('3'+val)
})
pusher.notify('click','czklove')
3.中间件模式
中间件模式在js中也广泛引用,如node的express框架,axios源码中的请求拦截器和访问拦截器,我们实现一个简单的中间件
/* 中间件模式 */
class app {
constructor () {
this.hanlders = []
}
/* 使用use将需要执行的目标插入执行队列中 */
use (fn) {
this.hanlders.push(fn)
}
/* 开始执行入口 */
run () {
/* done为当前的执行函数
如果已经执行进入了,则改为flase,
查看回调hanlders是否会调用next,
如果调用next则继续调用下一个回调函数
如果没有next则执行到此为止
*/
let done = true
function next () {
console.log('执行了next')
done = true
}
/* 待执行的队列 */
this.hanlders.forEach(hanlder => {
if (!done) {
return
} else {
done = false
hanlder(next)
}
});
if(done) {
this.callback();
}
}
/* 最终的回调执行函数 */
callback () {
console.log('我们最终需要执行的函数')
}
}
let p = new app();
p.use(next=> {
console.log('中间件1')
next()
})
p.use(next=> {
console.log('中间件2')
next()
})
p.use(next=> {
console.log('中间件3')
next()
})
p.run()
(注,p传入的回调函数,next只是一个形参,不一定非要是next)
中间件1
执行了next
中间件2
执行了next
中间件3
执行了next
我们最终需要执行的函数
如果我们注释掉中间件2的next 则输出的结果为 中间件1
执行了next
中间件2
4.单列模式
对象在全局只有一个实列对象
/* 单列模式 */
/* */
function createperson () {
class person {
constructor (name,age) {
this.name = name;
this.age = age;
}
}
var person1 = null;
return function (name,age) {
if (person) {
} else {
person1 = new person(name,age)
}
return person1
} }
let creatp = createperson(); /* 创建person的实列对象p1 */
let p1 = creatp('czklove','28')
/* 创建person的实列对象p2 */
let p2 = creatp('czklove','29')
console.log(p1===p2)
/* 最终输出true */
/* person全局只能有一个实列对象 */
5 工厂模式
根绝不同的要求,生产出不同的实例对象
/* 工厂模式 */
/* 很简单,大概就是下面这个样子,根据传入的参数,生成对应的实例对象 */
function createobj (type) {
function cj1 () {
this.name = 'czklove',
this.age = '17'
}
function cj2 () {
this.name = 'czklove',
this.age = '18'
}
function cj3 () {
this.name = 'czklove',
this.age = '19'
} switch (type) {
case 'cj1' :
return new cj1();
case 'cj2' :
return new cj2();
case 'cj3' :
return new cj3();
default:
return new cj1();
}
}
console.log(createobj('cj1'))
console.log(createobj('cj2'))
console.log(createobj('cj3')) //cj1 //{name: "czklove", age: "17"}
都是一些比较简单的模式,好多都用到了js中的闭包。好好理解闭包真的特别重要
js常见的设计模式一的更多相关文章
- js常见知识点3.面向对象之继承、设计模式
一.面向对象的三大特征 建议回复: 封装:屏蔽内部细节.调用外部接口实现对应功能(函数调用) 继承:子类继承父类中的属性和方法 多态(js中不存在多态的概念) 二.继承 建议回复: 继承:子类继承父类 ...
- js常见的判断移动端或者pc端或者安卓和苹果浏览器的方法总结
1.js常见的判断移动端或者pc端或者安卓和苹果浏览器的方法总结 : http://www.haorooms.com/post/js_pc_iosandmobile 2.Js判断客户端是否为PC还是手 ...
- touch.js——常见应用操作
touch.js--常见应用操作 基本事件: touchstart //手指刚接触屏幕时触发 touchmove //手指在屏幕上移动时触发 touchend //手指从屏幕上移开时 ...
- HTML+CSS+js常见知识点
一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...
- Android开发中常见的设计模式 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值
前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...
- javascript总结1:js常见页面消息输出方式 alert confirm console prompt document
.1 js常见的输出方法: 1-1 alert 警告框 alert("js语法总结"); 1-2 confirm 确认方法 confirm("js语法总结"); ...
- JS常见加密混淆方式
目录 前端js常见混淆加密保护方式 eval方法等字符串参数 emscripten WebAssembly js混淆实现 JSFuck AAEncode JJEncode 代码压缩 变量名混淆 字符串 ...
- Moment.js常见用法总结
Moment.js常见用法总结 Moment.js是一个轻量级的JavaScript时间库,它方便了日常开发中对时间的操作,提高了开发效率. 日常开发中,通常会对时间进行下面这几个操作:比如获取时 ...
随机推荐
- [HDU3072]:Intelligence System(塔尖+贪心)
题目传送门 题目描述 “这一切都是命运石之门的选择.”试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮).为了掌握时间机器的技术,SE ...
- EM 算法资料
EM 算法的英文全称是: Expectation-Maximum. EM 算法的步骤 假设 \(Z\) 是隐变量,\(\theta\) 是待定参数. E 步:固定参数 \(\theta\),求 \(Z ...
- AVLTree的实现以及左右旋转维持自平衡
AVL(Adelson-Velskii and Landis)树是带有平衡条件的二叉查找树.这个平衡条件必须要容易保持,而且它保证树的深度须是o(logN).最简单的想法是要求左右子树具有相同的高度, ...
- pycharm中如何安装使用jieba(结巴)
PyCharm的安装以及jieba包导入 1.打开Pycharm,点击左上角 >>File >>Settings 2.在settings界面中点击Project :pyCh ...
- Oracle JET mobile cordove navigator.app对象
在使用 Oracle JET 开发 webapp 时,会使用到 ojrouter ,ojrouter 默认含有历史记录推送功能.在调试 Android 时会发现返回键总是返回到上一次浏览记录(App ...
- scss 用法 及 es6 用法讲解
scss 用法的准备工作,下载 考拉 编译工具 且目录的名字一定不能出现中文,哪里都不能出现中文,否则就会报错 es6 用法 let 和 const let 声明变量的方式 在 {} 代码块里面才 ...
- 将Microsoft SQL Server 2000数据库转换成MySQL数据库
1. 下载并安装MyODBC.(如果是XP请下载5.3的旧版本,8.x的新版本运行有问题) 2. 创建一个空的MySQL数据库. 3. 在Windows >> 控制面板 >> ...
- ES6 暂时性死区
在ES6中,声明变量新增了两个关键字:let命令和const命令 如果在区块中存在let或者const命令时,任何变量都必须在声明之前使用,无论是区块外部的全局变量或者是区块内部的变量: /* 区块外 ...
- leetcode-mid-math-371. Sum of Two Integers-NO-???
mycode: 没思路啊...二级制四则运算不熟悉... 参考: 既然不能使用加法和减法,那么就用位操作.下面以计算5+4的例子说明如何用位操作实现加法: 1. 用二进制表示两个加数,a=5=0101 ...
- Selenium IDE环境部署
摘自https://blog.csdn.net/ywyxb/article/details/59103683 Selenium IDE环境部署 - Firefox浏览器 Firefox-ESR版本下载 ...