浅谈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 ...
随机推荐
- bzoj 1862: [Zjoi2006]GameZ游戏排名系统 & bzoj 1056: [HAOI2008]排名系统
傻叉了一晚上,把t打成x,然后这题神奇在于输出一段数,不足的不用输出,一开始我的是直接找没有后面就退,然后这样会格式错误囧……然后最后zj的还卡了下空间,于是不用string就过了……string毁一 ...
- Android ListView 显示多种数据类型
ListView往往可能会有不同的数据类型,单类型的数据可能运用会比较少些,这也是最近项目中的一个需求{在发送消息的时候,需要选择联系人,而联系人列表由英文字母索引+联系人组成},上一篇文章只是一个基 ...
- POJ2406:Power Strings——题解
http://poj.org/problem?id=2406 就是给一个串,求其循环节的个数. 稍微想一下就知道,KMP中nxt数组记录了所有可与前面匹配的位置. 那么如果我们的循环节长度为k,有n个 ...
- jQuery考试
No1: 分析:首先A答案是正确的jQuery中删除元素的方法有a,c,d所以排除B,另外c是清空,d虽然能删除但是不能删除元素所绑定的事件等等. No2: 分析:A是正确的通过get(index)的 ...
- bzoj2064: 分裂(集合DP)
......咸鱼了将近一个月,因为沉迷ingress作业越来越多一直没时间搞OI呜呜呜 题目大意:有一个初始集合(n个元素)和一个目标集合(m个元素)(1<=n,m<=10),两个操作 ...
- C++派生类继承的理解
#include<iostream> using namespace std; class Base{ public: Base() { a=; cout<<"Bas ...
- HDU1522 稳定婚姻匹配 模板
Marriage is Stable Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- Linux查看内核和系统版本
1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompile@crowe.d ...
- 【Android】完善Android学习(二:API 2.3.4)
备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...
- [Luogu 1168] 中位数
中位数可以转化为区间第k大问题,当然是选择Treap实现名次树了啊.(笑) 功能十分简单的Treap即能满足需求--只需要插入与查找第大的功能. 插入第i个数时,如果i是奇数,随即询问当前排名第(i+ ...