前端23种js设计模式中参见的7种设计模式的学习
创建型设计模式
是一类处理对象创建的设计模式,通过某种方式控制对象的创建来避免基本对象创建时可能导致设计上的问题或增加设计上的复杂度。
1)工厂模式
class Product {
constructor(options) {
this.name = options.name;
this.time = options.time;
this.init();
}
init() {
console.log(`产品名:${this.name} 保质期:${this.time}`);
}
}
class Factory {
create(options) {
return new Product(options);
}
}
let factory = new Factory();
let product1 = factory.create({ name: "面包", time: "1个月" });
2)单例模式 (一个类只有一个实例)
function SingleObject() {
this.name = "单例";
}
SingleObject.getInstance = function() {
if (!this.instance) {
this.instance = new SingleObject();
}
return this.instance;
};
var obj1 = SingleObject.getInstance();
var obj2 = SingleObject.getInstance();
console.log(obj1 === obj2);
结构型设计模式
关注于如何将类或对象组合成更大、更复杂的结构,以简化设计。
1)适配器模式
// 新增加的适配器
class Adaptee {
constructor() {
this.name = "我是适配器";
}
parse() {}
} // 原来的旧代码
class OldApi{
constructor(){
this.name = '我是旧的接口'
this.adaptee = new Adaptee()
this.adaptee.parse()
}
} var oldApi = new OldApi()
2)装饰器模式
class Circle {
draw() {
console.log("draw");
}
}
class Decorator{
constructor(circle) {
this.circle = circle
}
setRedBorder() {
console.log('border装饰为红色')
}
draw() {
this.circle.draw()
this.setRedBorder()
}
}
let circle = new Circle()
let decorator = new Decorator(circle)
circle.draw()
decorator.draw()
3)代理模式【无法直接访问时,通过代理来访问目标对象】
class Data{
constructor(){
this.name = '元数据'
}
getName(){
console.log(this.name)
}
}
class ProxyData{
constructor(data){
this.data = data
}
getName(){
this.data.getName()
}
}
let data = new Data()
let proxyData = new ProxyData(data)
data.getName()
proxyData.getName()
行为型设计模式
用于不同对象之间职责划分或者算法抽象,行为型设计模式不仅仅涉及类和对象,还涉及类或对象之间的交流模式并加以实现。
1)观察者模式
class EventEmitter {
constructor() {
this.eventMap = {};
}
on( type, fn ) {
if ( !this.eventMap[type] ) {
this.eventMap[type] = []
}
this.eventMap[type].push(fn)
}
emit( type, ...params ) {
this.eventMap[type].forEach(fn => {
fn(...params);
});
}
off( type, fn ) {
let list = this.eventMap[type];
let atIndex = list.indexOf(fn);
if (atIndex !== -1) {
list.splice(atIndex, 1);
}
}
}
2)迭代器模式【1.按顺序访问集合, 2.调用者不用关心内部的数据结构】
function each(data) {
let iterator = data[Symbol.iterator]();
let item = { done: false };
while (item.done === false) {
item = iterator.next();
if ( item.done ) return item
console.log(item)
}
}
let arr = [1, 2, 3, 4];
let nodeList = document.querySelectorAll("p");
let m = new Map();
m.set("a", 100);
m.set("b", 100);
each(arr)
each(nodeList)
each(m)
class Iterator{
constructor(wrapper) {
this.list = wrapper.list
this.index = 0
}
next() {
if ( this.hasNext() ) {
return this.list[this.index++]
} else {
return null
}
}
hasNext() {
return this.index < this.list.length
}
}
class Wrapper {
constructor(list) {
this.list = list
}
getIterator(iterator) {
return new Iterator(this)
}
}
var arr = [1, 2, 3]
var iterator = new Wrapper( arr ).getIterator()
while ( iterator.hasNext() ) {
console.log(iterator.next())
}
参考文献: https://segmentfault.com/a/1190000017145504
前端23种js设计模式中参见的7种设计模式的学习的更多相关文章
- js正则表达式中的问号几种用法小结
这篇文章主要介绍了js正则表达式中的问号几种用法,比如+?,*?,{2,3}?可以停止匹配的贪婪模式,感兴趣的朋友可以参考下 在表示重复的字符后面加问号,比如+?,*?,{2,3}?可以停止匹配的贪婪 ...
- thinkphp在前端页面的js代码中可以使用 U方法吗? 可以使用模板变量如__URL__等吗?
thinkphp在前端页面的js代码中可以使用 U方法吗? : 可以的! tp的U方法, 是"全局的", 什么是全局的? 就是, 可以在 "任何地方"使用的: ...
- JS数组中every(),filter(),forEach(),map(),some()方法学习笔记!
ES5中定义了五种数组的迭代方法:every(),filter(),forEach(),map(),some(). 每个方法都接受两个参数:要在每一项运行的函数(必选)和运行该函数的作用域的对象-影响 ...
- 对比几种在ROS中常用的几种SLAM算法
在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...
- js正则表达式中的问号使用技巧总结
这篇文章主要介绍了js正则表达式中的问号几种用法,比如+?,*?,{2,3}?可以停止匹配的贪婪模式等例子的解析. 在表示重复的字符后面加问号,比如+?,*?,{2,3}?可以停止匹配的贪婪模式. v ...
- Java中创建对象的五种方式
我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone ...
- 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理
服务器文档下载zip格式 刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...
- Mybatis 中经典的 9 种设计模式!面试可以吹牛了
虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...
- 在JS方法中返回多个值的三种方法
在使用JS编程中,有时需要在一个方法返回两个个或两个以上的数据,用下面的几种方法都可以实现: 1 使用数组的方式,如下: <html> <head> <title> ...
随机推荐
- solr学习笔记-增加mmesg4J中文分词
solr版本6.1.centos6.7.mmesg4j版本2.30 solr安装目录:/usr/local/solr-6.1.0 1.下载mmesg4j包: 地址:https://github.com ...
- WPF文本输入框关闭Win10输入法设置
今天一个同事突然站起来给了我一个眼神,我就知道没啥好事.果然给我指出了一些bug,其中一个是这样的,密码输入框只能输入一个字符,再输入就输入不了. 这种降档次的错误咱也能出,果断夺过键盘,疯狂输入一番 ...
- ABCD 谁是小偷
题目: 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷.审问中,a说:“我不是小偷.”b说:“c是小偷.”c说:“小偷肯定是d.”d说:“c在胡说.” 现在已经知道这四人中有三人说的是真 ...
- Java入门指南-03 操作符与表达式
一.赋值操作符 在 Java 语言里,等号称为赋值操作符.例:a = b + 100;注意,不要把 Java 语言理解为数学.在 Java 里,这个等号的作用是“赋值”,即右侧的值赋给左边的变量. 要 ...
- Redis位操作介绍
在学习redis的过程了,看到了redis还能用于大数据处理,具体场景如下:腾讯10亿用户,要几个毫秒内查询到某个用户是否在线,你能怎么做?千万别说给每个用户建立一个key,然后挨个记(你可以算一下需 ...
- Charles中使用Map Local提高测试效率
书接上回,上次说到Charles中可以使用修改返回值来模拟接口返回,这次我们来说一下Charles中另外一个强大的功能. 我们用手机连接Charles,具体可以参考上一篇<借助Charles来测 ...
- RMQ最大值最小值
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using ...
- Python核心技术与实战——二十|Python的垃圾回收机制
今天要讲的是Python的垃圾回收机制 众所周知,我们现在的计算机都是图灵架构.图灵架构的本质,就是一条无限长的纸带,对应着我们的存储器.随着寄存器.异失性存储器(内存)和永久性存储器(硬盘)的出现, ...
- IDEA中方法的快捷键及自定义方法
1. 字母组合联想到对应的方法 ·ps联想到public static方法和成员 ·输入psvm联想到主方法 ·输入psf联想到用public static final 等 · pc联想到clone和 ...
- grunt-contrib-watch 实时监测文件状态
grunt-contrib-watch:实时监测文件的增删改状态,状态改变时自动执行预定义任务使用watch时,被watch的文件可以分开写,这样可以提高watch的性能,不用每次把没修改的文件也执行 ...