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时间库,它方便了日常开发中对时间的操作,提高了开发效率. 日常开发中,通常会对时间进行下面这几个操作:比如获取时 ...
随机推荐
- VirtualBox NAT Host-only模式下,自动分配IP上网。
修改宿主机上,virtualbox自建虚拟网卡Host-Only 2. 因为我使用了两个适配器,所以这两个适配器的名字分别是ifcfg-eth0, ifcfg-eth1. ifcfg-eh0一般默认就 ...
- Ubuntu 16.04修改ssh端口
1 安装防火墙 sudo apt-get install ufw启用 sudo ufw enable sudo ufw default deny 作用:开启了防火墙并随系统启动同时关闭所有外部对本机的 ...
- vue 中 event.stopPropagation() 和event.preventDefault() 使用
1.event.stopPropagation()方法 这是阻止事件的冒泡方法,不让事件向document上蔓延,但是默认事件任然会执行,当你掉用这个方法的时候,如果点击一个连接,这个连接仍然会被打开 ...
- git本地分支推送到远程分支
1.创建的创建和初始化 创建git仓库可以在远端创建一个仓库, 然后check到本地,在本地的文件里创建工程文件,然后提交 也可以将本地现有的工程和远端的空仓库关联 本地创建了一个工程 iOSDemo ...
- 基于DRF的图书增删改查练习
功能演示 信息展示 添加功能 编辑功能 删除功能 DRF构建后台数据 本例的Model如下 from django.db import models class Publish(models.Mode ...
- AJAX向Django后端提交POST请求
一.ajax登录示例 二.CSRF跨站请求伪造 方式一 方式二 方式三 方式四 一.ajax登录示例 urls.py from django.conf.urls import url from dja ...
- 构造Map并对其排序
#构造Map并对其排序 attr_tul = ['a','b','c','d','e','f'] one_tul = [,,,,,] one_dic = {} for i in range(len(a ...
- MySQL 常用报错注入原理分析
简介 这段时间学习SQL盲注中的报错注入,发现语句就是那么两句,但是一直不知道报错原因,所以看着别人的帖子学习一番,小本本记下来 (1) count() , rand() , group by 1.报 ...
- 中国MOOC_面向对象程序设计——Java语言_第1周 类与对象_1分数
第1周编程题 查看帮助 返回 我们在题目说明中给出了一部分代码,你需要在这部分代码的基础上,按照题目说明编写代码,然后将两部分代码一起提交. 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨 ...
- 超详细 SpringMVC @RequestMapping 注解使用技巧
@RequestMapping 是 Spring Web 应用程序中最常被用到的注解之一.这个注解会将 HTTP 请求映射到 MVC 和 REST 控制器的处理方法上. 在这篇文章中,你将会看到 @R ...