什么是模式

模式是一种可复用的解决方案,可用于解决软件设计中遇到的常见问题。

也就是说用来解决常见问题的可复用的解决方案。

常见的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设计模式的更多相关文章

  1. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  2. 浅谈JavaScript中的闭包

    浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...

  3. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  4. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

  5. 浅谈javascript的原型及原型链

    浅谈javascript的原型及原型链 这里,我们列出原型的几个概念,如下: prototype属性 [[prototype]] __proto__ prototype属性 只要创建了一个函数,就会为 ...

  6. 浅谈JavaScript中的null和undefined

    浅谈JavaScript中的null和undefined null null是JavaScript中的关键字,表示一个特殊值,常用来描述"空值". 对null进行typeof类型运 ...

  7. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

  8. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  9. 浅谈JavaScript中的内存管理

    一门语言的内存存储方式是我们学习他必须要了解的,接下来让我浅谈一下自己对他的认识. 首先说,JavaScript中的变量包含两种两种类型: 1)值类型或基本类型:undefined.null.numb ...

随机推荐

  1. 【树形DP】【UVA10859】 Placing Lampposts

    传送门 Description 给定一个\(n\)个点\(m\)条边的无向无环图,选择尽量少的节点,使得所有边都至少有一个顶点被选择.在这个基础上,要求有两个顶点被选择的边数尽可能大 Input 多组 ...

  2. MyBatis子查询

    一.父查询BaseChildResultMap: <?xml version="1.0" encoding="UTF-8" ?> <!DOCT ...

  3. PowerDesigner 技巧【2】

    去掉Oracle生成的SQL创建语句中的双引号 用powerdesigner导出orale数据库的建表sql时,默认会给表名和字段名加上双引号,如下图: 这样给操作数据库带来很大的不便,解决的办法是设 ...

  4. 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 ...

  5. bzoj 1179 [Apio2009]Atm 缩点+最短路

    [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 4290  Solved: 1893[Submit][Status][Dis ...

  6. 008.C++类改写模板类

    1.普通类 //class head class complex //class body {} { public: complex(, double i) :re(r), im(i) {}//构造函 ...

  7. HRBUST 1819

    石子合并问题--圆形版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 61(27 users) Total Accepted: 26( ...

  8. CentOS 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)

    转载自:https://linux.cn/article-4314-1.html 编译自:http://xmodulo.com/install-lemp-stack-centos.html 作者: D ...

  9. 二叉树系列 - [LeetCode] Symmetric Tree 判断二叉树是否对称,递归和非递归实现

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...

  10. MySQL新建用户,授权

    登录MySQL mysql -u root -p 添加新用户 允许本地 IP 访问 localhost, 127.0.0.1 create user 'test'@'localhost' identi ...