《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书《JavaScript设计模式》,这本书中描述了更多的设计模式。
一、创建型设计模式
包括简单工厂、工厂方法、抽象工厂、建造者、原型和单例模式。
1)简单工厂
又叫静态工厂方法,由一个工厂对象决定创建某一种产品对象类的实例。
两种实现方式,第一种是通过类实例化对象创建,第二种是创建一个新对象然后包装增强其属性和功能。
2)工厂方法
通过对产品类的抽象使其创建业务主要负责用于创建多类产品的实例。
将工厂方法看作是一个实例化对象的工厂类。
3)抽象工厂
通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例。
用它作为父类来创建一些子类。
4)建造者
将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示。
它更关心的是创建这个对象的整个过程,甚至于创建对象的各个细节。
5)原型模式
用原型实例指向创建对象的类,使用于创建新的对象的类共享原型对象的属性以及方法。
原型模式就是将可复用的、可共享的、耗时大的从基类中提取出来,放在其原型中,子类通过组合继承或寄生继承将方法和属性继承下来。
6)单例模式
只允许实例化一次的对象类。有时我们也用一个对象来规划一个命名空间,井井有条的管理对象上的属性和方法。
二、结构型设计模式
1)外观模式
为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口使得对子系统接口的访问更容易。
在JS中有时也会用于对底层结构兼容性做统一封装来简化用户使用。
2)适配器模式
将一个类(对象)的接口(方法或属性)转化成另外一个接口,满足用户需求,使类(对象)之间接口的不兼容问题通过适配器解决。
适配异类框架,参数适配器,适配数据。
3)代理模式
由于一个对象不能直接引用另一个对象,所以需要代理对象在这两个对象之间起到中介的作用。
站长统计、JSONP、代理模版。
4)装饰者模式
在不改变原对象的基础上,通过对其进行包装拓展(添加属性或方法)使原有对象能够满足更复杂的需求。
5)桥接模式
在系统沿着多个纬度变化的同时,不增加其复杂度并已达到解耦。
提取共同点,事件与业务逻辑之间的桥梁,多元化对象。
将实现层(如元素的绑定事件)与抽象层(如修饰页面UI逻辑)解耦分离,使两部分可以独立变化。
6)组合模式
又称部分-整体模式,将对象组合成树形结构以表示“部分整体”的层次结构。
组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合对象类通过继承同一个父类使其具有统一的方法,此时单体成员和组合成员行为表现就比较一致。
7)享元模式
运用共享技术有效的支持大量的细粒度对象,避免对象间拥有相同内容造成多余的开销。
享元对象,享元动作。将共有的方法和数据提取,以提高页面效率。
三、行为型设计模式
1)模版方法模式
父类中定义一组操作算法骨架,而将一些实现步骤延迟到子类中,使得子类可以不改变父类的结构算法的同时可重新定义算法中某些步骤的实现。
提示框归一化。
2)观察者模式
又被称作发布-订阅模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能的耦合。
最大的作用是解决类或对象之间的耦合,解决两个相互依赖的对象,使其依赖于观察者的消息机制。
3)状态模式
当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象。
状态模式既是解决程序中臃肿的分支判断语句问题,将每个分支转化为一种状态独立出来,方便每种状态的管理又不至于每次执行时遍历所有分支。
4)策略模式
将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端变化而变化。
策略模式使得算法脱离于模块逻辑而独立管理,使我们专心研发算法,而不必受模块逻辑所约束。
对分支语句的优化目前有3种,工厂方法、状态模式与策略模式。
5)职责链模式
解决请求的发送者与请求的接收者之间的耦合,通过职责链上的多个对象分解请求流程,实现请求在多个对象之间的传递,直到最后一个对象完成请求的处理。
分解需求,把每件事情分解成一个模块对象处理,需求分解成相互独立的部分,分工合作只做自己份内的事情,无关的事情传到下一个对象中,直到完成。
请求模块==》响应数据适配模块==》创建组件模块==》单元测试
6)命令模式
将创建模块的逻辑封装在一个对象里,这个对象提供一个参数化的请求接口,通过调用这个接口并传递参数实现对象内部的一些方法。
封装功能,提供简单而高效的API,解决命令的发起者和命令的执行者之间的耦合。
7)访问者模式
针对于对象结构中的元素,定义在不改变对象的前提下访问结构中元素的新方法。
8)中介者模式
通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用,降低他们之间的耦合。
观察者模式中的订阅者是相互的,而中介者模式订阅者是单向的,消息统一由中介者对象发布,所有的订阅者间接的被中介者管理。
9)备忘录模式
在不破坏对象的封装性的前提下,在对象之外捕获并保存该对象内部的状态以便日后对象使用,或者对象恢复恢复到以前的某个状态。
缓存数据,MVC中的M部分,很多时候都会缓存一些数据。
10)迭代器模式
在不暴露对象内部结构的同时,可以顺序的访问聚合对象内部的元素。
迭代器是优化循环语句的一种可行方案,使得程序清晰易读,解决了对象的使用者与对象内部结构之间的耦合。
四、技巧型设计模式
1)委托模式
多个对象接收并处理同一请求,他们将请求委托给另一个对象统一处理请求。
委托父元素、预言未来、数据分发。
2)节流模式
对重复的业务进行节流控制,执行最后一次操作并取消其他操作,以提高性能。
节流器、图片延迟加载、统计打包。
3)简单模版模式
通过格式化字符串拼凑出视图,避免创造视图时大量节点操作。
用正则匹配方式去格式化字符串性能要远高于拼接视图执行性能。
包括三部分:字符串模版库,格式化方法,字符串拼接操作。
4)惰性模式
减少每次代码执行时的重复性分支判断,通过对对象重定义来屏蔽原对象中的分支判断。
惰性模式分为两种:第一种文件加载后立即执行对象方法来重定义,第二种是当第一次使用方法对象时来重定义。
5)参与者模式
在特定的作用域中执行给定的函数,并将参数原封不动地传递。
参与者模式是两种技术的结晶,函数绑定和函数柯里化。
6)等待者模式
通过对多个异步进程监听,来触发未来发生的动作。
等待者模式意在处理耗时比较长的操作,定时器操作、异步操作等。
在耗时操作内埋入监听者对象,在某个时刻改变监听者对象的状态,当所有监听者对象都是已完成的时候,执行完成回调,如果有一个是中断,就执行中断回调。
五、架构型设计模式
1)同步模块
请求发出后,无论模块是否存在,立即执行后续的逻辑,实现模块开发中对模块的立即使用。
2)异步模块
AMD,请求发出后,继续其他业务逻辑,直到模块加载完成后执行后续的逻辑,实现模块开发中对模块加载完成后的引用。
3)MVC
用一种将业务逻辑、数据、视图分离的方式组织架构代码。
在视图层创建界面的时候,会用到模型层内的数据,使这两层耦合在一起。降低了视图创建的灵活性和复用性。
4)MVP
View层不直接引用Model层的数据,而是通过Presenter层实现对Model层的数据访问。
所有层次的交互都发生在Presenter层中,解决View层和Model层之间的耦合。
但视图层还不够独立,创建怎样的视图由Presenter控制。
5)MVVM
为View层量身订做一套ViewMode层,并在ViewMode中创建属性和方法,为View层绑定Model层的数据,并实现交互。
一个ViewMode可以对应多个View层或Model层,ViewMode中的代码变得高度复用。
View层的独立开发,可以使那些不懂JS的人,只需了解HTML内容并按照View层规范格式,创建视图,即可完成一个复杂的页面开发。
《JavaScript设计模式 张》整理的更多相关文章
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- JavaScript设计模式与开发实践 - 观察者模式
概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- JavaScript设计模式与开发实践 - 单例模式
引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...
- 《javascript设计模式与开发实践》--- (单一职责原则)
看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...
- JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)
说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...
- 《JavaScript设计模式与开发实践》读书笔记-基础知识
笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...
- 《Javascript设计模式与开发实践》--读书笔记
第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...
- 《Javascript设计模式与开发实践》关于设计模式典型代码的整理:单例模式、策略模式、代理模式、迭代器模式、发布-订阅模式、命令模式、组合模式
1.单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 使用闭包封装私有变量// 使用闭包创建单例var user = (function () { var _name = 'sven' ...
- JavaScript设计模式与开发实践——JavaScript的多态
“多态”一词源于希腊文polymorphism,拆开来看是poly(复数)+ morph(形态)+ ism,从字面上我们可以理解为复数形态. 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不 ...
随机推荐
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
- 参考bootstrap中的popover.js的css画消息弹框
前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...
- javascript 判断参数类型大全
js 判断类型的在开发中是很常用的,因为js 是弱类型的语言,var 可以接受任何形式的类型,但是在真正的开发中,我们需要根据不同类型做不同的处理,所以这个是必须的精通. 首先需要知道 typeof这 ...
- Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...
- Java多态性——分派
一.基本概念 Java是一门面向对象的程序设计语言,因为Java具备面向对象的三个基本特征:封装.继承和多态.这三个特征并不是各自独立的,从一定角度上看,封装和继承几乎都是为多态而准备的.多态性主要体 ...
- APP多版本共存,服务端如何兼容?
做过APP产品的技术人员都知道,APP应用属于一种C/S架构的,所以在做多版本兼容,升级等处理则比较麻烦,不像web应用那么容易.下面将带大家分析几种常见的情况和应对方式: 小改动或者新加功能的 这种 ...
- 解决mysql插入数据时出现Incorrect string value: '\xF0\x9F...' for column 'name' at row 1的异常
这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而MySQL的utf8编码最多3个字节,所以数据插不进去. 我的解决方案是这样的 1.在mysql ...
- 初学DirectX11, 留个纪恋。
以前学的是openGL, 最近才开始学DirectX11,写了个很垃圾的代码,怀念以前的glPushMatrix(), glPopMatrix(), glBegin(), glEnd(), 多简单啊, ...
- mysql join 和left join 对于索引的问题
今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...