浅谈Javascript设计模式
什么是模式
模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题。
也就是说用来解决常见问题的可复用的解决方案。
常见的js设计模式
Constructor(构造器)模式
Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法。
这是我们最常用的一种设计模式。
Object构造器
比如在js中新建一个对象,就是以js中的Object构造器,新建一个Object的实例,这就是构造器模式。
(举例)
基本Constructor构造器
除了js自带的Object构造器,还可以自己通过构造函数,写一个基本的Constructor构造器。通过构造函数新建的实例也是用的构造器模式。
(举例)
Module(模块)模式
现在js都是模块化编程,所以在模块化这方面也有很多的模式。
最开始的时候,我们都用一个对象来分割模块,把所有的东西通过字面量写到一个对象里取,这种模式就是对象字面量表示法。
(举例)
对象字面量表示法把属性和方法都直接暴露在外,但是我们需要一些私有的属性和方法的时候,对象字面量表示法就很不方便了。所以在此基础上改进,我们有了Module模式。
Module模式使用闭包封装“私有“状态和组织。它提供了一种包装混合公有/私有方法和变量的方式,防止其泄露至全局作用域并与别的开发人员的接口发生冲突。
通过该模式,只需返回一个公有API,而其他的一切则都维持在私有闭包里。
(举例)
Revealing Module(揭示模块)模式
Revealing Module,揭示模块模式,其实是module模式的升级版。它能够在私有范围内简单定义所有的函数和变量,并返回一个匿名对象,它拥有指向私有函数的指针,该函数是他希望展示为公有的方法。
(举例)
Singleton(单例)模式
单例模式,就是限制了类的实例化次数只能一次。在该实例不存在的情况下,可以通过一个方法创建一个类来实现创建类的新实例;如果实例已经存在,他会简单返回该对象的应用。
比如,可以用Singleton充当共享资源命名空间,从全局命名空间中隔离出代码实现,从而为函数提供单一访问点。
(举例)
Observer(观察者)模式
观察者模式就是,一个对象(称为subject)维持一系列依赖于它(观察者)的对象,将有关状态的任何变更自动通知给它们。
一系列对象(观察者)依赖于一个对象(subject),这个对象(subject)维持着和这些观察者对象的关系,有关状态发生的任何变更都将由这个对象(subject)自动通知给这一系列的对象(观察者)。
也就是,一群观察者依附在目标对象上,然后,当具体观察者的具体目标发生变化时,具体目标向目标发出通知,然后通过目标对象将这个具体目标的变化通知到所有的观察者。
(举例)
比较概念的解释是,目标和观察者是基类,目标提供维护观察者的一系列方法,观察者提供更新接口。具体观察者和具体目标继承各自的基类,然后具体观察者把自己注册到具体目标里,在具体目标发生变化时候,调度观察者的更新方法。
比如有个“天气中心”的具体目标A,专门监听天气变化,而有个显示天气的界面的观察者B,B就把自己注册到A里,当A触发天气变化,就调度B的更新方法,并带上自己的上下文。
(举例)
Publish/Subscribe(发布/订阅)模式
比较概念的解释是,订阅者把自己想订阅的事件注册到调度中心,当该事件触发时候,发布者发布该事件到调度中心(顺带上下文),由调度中心统一调度订阅者注册到调度中心的处理代码。
比如有个界面a是实时显示天气,它就订阅天气事件(注册到调度中心c,包括处理程序),当天气变化b时(定时获取数据),b就作为发布者发布天气信息到调度中心c,调度中心就调度订阅者a的天气处理程序。
Publish/Subscribe模式使用了一个主题/事件通道,这个通道介于希望收到通知(订阅者)的对象和激活时间的对象(发布者)之间。该事件系允许代码定义应用程序的特定事件,这些事情可传递自定义参数,自定义参数包含订阅者所需的值。其母的是避免订阅者和发布者之间产生依赖关系。
(举例)
观察者模式和发布/订阅模式还是很像的,都是通过注册到某个目标里,然后目标发生改变的时候,通过目标上的接口将这个改变通知到所有预先注册过的对象,
也就是说,这两种模式都带有订阅和发布的功能,发布/订阅模式多了一个中间者,可以避免订阅者(观察者)和发布者(目标)直接耦合。
Mediator(中介者)模式
Mediator模式存进松散耦合的方式是:确保组件的交互式通过这个中心点来处理的,而不是通过显示地引用彼此。
中介者模式是指用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。简单地说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别与“中介”对象引用或者依赖。
中介者模式并不带有监听改变和广播的功能,只是为其他的对象提供一个中介,使对象之间的耦合关系减弱。
(举例)
Prototype(原型)模式
Prototype模式为一种基于现有对象模板,通过克隆方式创建对象的模式。
也就是深复制。也就是传值赋值。
(举例)
Command(命令)模式
不懂,无法解释
Facade(外观)模式
不懂,无法解释
Factory(工厂)模式
是一种创建型模式。它不显式的要求使用一个构造函数。Factory提供一个通用的接口来创建对象。
比如jQuery。常用的$(‘#wrapper’)就是一个工厂模式,通过这个$之后,这个就变成了jQuery对象,然后就具有jQuery对象的各种属性和方法。
Mixin模式
不懂,无法解释
Decorator(装饰者)模式
这个,在es7里有用到。
简单的说,Decorator提供了将行为动态添加至系统的现有类的能力。其想法是,装饰本身对于类原有的基本功能来说并不是必要的;否则,它就可以被和并到超类本身了。
装饰者可以用于修改现有的雄,希望在系统中为对象添加额外的功能,而不需要大量修改使用它们的底层代码。
Flyweight(享元)模式
不懂,无法解释
浅谈Javascript设计模式的更多相关文章
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 浅谈JavaScript浮点数及其运算
原文:浅谈JavaScript浮点数及其运算 JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...
- 浅谈 JavaScript 编程语言的编码规范
对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...
- 浅谈javascript的原型及原型链
浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...
- 浅谈JavaScript中的null和undefined
浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...
- 浅谈JavaScript中的正则表达式(适用初学者观看)
浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
- 浅谈JavaScript中的内存管理
一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...
随机推荐
- 【树形DP】【UVA10859】 Placing Lampposts
传送门 Description 给定一个\(n\)个点\(m\)条边的无向无环图,选择尽量少的节点,使得所有边都至少有一个顶点被选择.在这个基础上,要求有两个顶点被选择的边数尽可能大 Input 多组 ...
- MyBatis子查询
一.父查询BaseChildResultMap: <?xml version="1.0" encoding="UTF-8" ?> <!DOCT ...
- PowerDesigner 技巧【2】
去掉Oracle生成的SQL创建语句中的双引号 用powerdesigner导出orale数据库的建表sql时,默认会给表名和字段名加上双引号,如下图: 这样给操作数据库带来很大的不便,解决的办法是设 ...
- Saddle Point ZOJ - 3955 题意题
Chiaki has an n × m matrix A. Rows are numbered from 1 to n from top to bottom and columns are numbe ...
- bzoj 1179 [Apio2009]Atm 缩点+最短路
[Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 4290 Solved: 1893[Submit][Status][Dis ...
- 008.C++类改写模板类
1.普通类 //class head class complex //class body {} { public: complex(, double i) :re(r), im(i) {}//构造函 ...
- HRBUST 1819
石子合并问题--圆形版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(27 users) Total Accepted: 26( ...
- CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
转载自:https://linux.cn/article-4314-1.html 编译自:http://xmodulo.com/install-lemp-stack-centos.html 作者: D ...
- 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- MySQL新建用户,授权
登录MySQL mysql -u root -p 添加新用户 允许本地 IP 访问 localhost, 127.0.0.1 create user 'test'@'localhost' identi ...