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时间库,它方便了日常开发中对时间的操作,提高了开发效率. 日常开发中,通常会对时间进行下面这几个操作:比如获取时 ...
随机推荐
- java agent问题
Error occurred during initialization of VMagent library failed to init: instrumentobjc[36987]: Class ...
- [design pattern](3) Dectorator
前言 很久没有写关于设计模式的博客了,实在是没有太多的精力去写.但个人觉得设计模式在我们的日常开发中还是挺重要的,它提高了软件的可维护性.因此还是有必要坚持学习设计模式,写博客主要是为了加深我对设计模 ...
- python学习之路(22)
使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env python # - ...
- 大数据笔记(三十)——一篇文章读懂SparkSQL
Spark SQL:类似Hive ======================================================= 一.Spark SQL基础 1.什么是Spark SQ ...
- tomcat简单性能优化
1.内存使用配置 2.最大连接数配置
- 使用C#检测电脑上是否安装某软件
private void button2_Click(object sender, EventArgs e) { try { string app = "chrome.exe"; ...
- 安装mysql数据库要注意的
只安装基本功能即可,以后要的话可以加 需要配置环境变量 最好不要将数据存放在c盘,默认在 C:\ProgramData\MySQL\MySQL Server 5.6 里面存放建的表和存放的数据
- ubuntu服务器允许Root用户登录
1.重置root密码 sudo passwd root 2.修改ssh配置文件 sudo vim /etc/ssh/sshd_config后进入配置文件中修改PermitRootLogin后的默认值为 ...
- PHP 数组函数 内部指针
current( &$arr ) 每个数组的当前单元,初始值的 数组的第一个单元next ( &$arr ) 返回数组中的下一个单元 , 如果没值则返回falshprev ( & ...
- 安装iamp模块,编译报错configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.
yum install libc-client-devel cd /root/lnmp1.0-full/php-5.3.17/ext/imap /usr/local/php/bin/phpize ./ ...