javaScript设计模式简记(4)-技巧型设计模式

happinessaflower 2020-06-06

1.链模式

链模式(Operate of Responsibility):通过在对象方法中将当前对象返回,实现对同一个对象多个方法的链式调用。从而简化对该对象的多个方法的多次调用时,对该对象的多次引用。

JavaScript中的链模式的核心思想就是通过在对象中的每个方法调用执行完毕后返回当前对象this来实现的。由于链模式使得代码紧凑简洁而高效,在工作中已经得到很广泛的应用。当然当前主流代码库都以该模式作为自己的一种风格。 例如jQuery 等等。所以说熟知链模式的工作原理,在我们实际工作中是很有帮助的。

研究Jquery源码去(后续补充-手把手学会搭建自己的jq库)

2.委托模式

委托模式(Entrust): 多个对象接收并处理同一请求,他们将请求委托给另-一个对象统一处理请求。

典型:事件委托机制

委托模式是通过委托者将请求委托给被委托者去处理实现的。因此委托模式解决了请求与委托者之间的耦合。通过被委托者对接收到的请求的处理后,分发给相应的委托者去处理。在JavaScript中,委托模式已经得到很广泛的应用,尤其在处理事件上,当然委托模式是一种基础技巧,因此也同样在其他设计模式中被引用,如状态模式中状态对象对接收的状态处理,策略模式中策略对象对接收到的算法处理,命令模式中命令对象对接收到的命令处理等。

3.数据访问对象模式

数据访问对象模式(Data access object-DAO):抽象和封装对数据源的访问与存储,DAO通过对数据源链接的管理方便对数据的访问与存储。

数据访问对象(DAO)模式即是对数据库的操作(如简单的CRUD创建、读取、更新、删除)进行封装,用户不必为操作数据库感到苦恼,DAO已经为我们提供了简单而统一的操作接口。并且对于使用者来说,不必了解DAO内部操作是如何实现的,有时甚至不必了解数据库是如何操作的。对于后端数据库来说(如MongoDB),DAO对象甚至会保留对数据库的链接,这样我们每次操作数据库时不必一次次地向数据库发送链接请求。DAO是一个对象,因此它封装了属性和方法,并通过这些属性与方法管理着数据库。因此有时为了实现需求我们还可以对DAO对象进行拓展。但是更佳实践是对DAO做一层适用于自己的封装,这样在团队开发中不会影响到他人的使用。

(后续补充-手把手学会数据库封装操作)

4.节流模式

节流模式(Throttler): 对重复的业务逻辑进行节流控制,执行最后一次操作并取消其他操作,以提高性能。

构造节流器的思路是这样的:首先节流器应该能做两件事情,第--件事情就是清除将要执行的函数,此时要对节流器传递两个参数(是否清除,执行函数), 如果第一个参数为true,则表示清除将要执行的函数。同时会判断第二个参数(执行函数)有没有计时器句柄,有则清除计时器。节流器能做的第二件事情就是延迟执行函数。此时要传递两个参数(执行函数,相关参数)。在节流器内部首先要为执行函数绑定一个计时 器句柄,来保存该执行函数的计时器,对于第二个参数一相关参 数来说,大致包括3个部分,执行函数在执行时的作用域、执行函数的参数、执行函数延迟执行的时间。

对于DOM的操作,常常会占用大量的内存资源和cpu处理时间。甚至大量的DOM操作在一些浏览器中也很可能导致浏览器的崩溃。由于JavaScript的单线程处理机制,导致DOM操作占用大量资源时会严重堵塞后面重要程序的执行。节流模式的核心思想是创建计时器,延迟程序的执行。这也使得计时器中回调函数的操作异步执行(这里的异步执行并不是说JavaScript 是多线程语言,JavaScript 从设计之初就是单线程语言,异步只是说脱离原来程序执行的顺序,看上去,异步程序像是在同时执行。但是某一时刻,当前执行的程序一定是所有异步程序( 包括原程序)中的某一个)。由此可看出节流模式主要有两点优势:第一,程序能否执行是可控的。执行前的某一时刻是否清除计时器来决定程序是否可以继续执行。第二,程序是异步的。由于计时器机制,使得程序脱离原程序而异步执行(当然随着worker技术的兴起,也可开启多线程模式实现),因此不会影响后面的程序的正常执行。在其他方面,比如对异步请求(ajax) 应用节流,此时可以优化请求次数来节省资源。最后,对于在节流器中对计时器的设置,有的人可能感觉直接绑定在原函数会暴露计时器句柄,这使得外部可修改。当然你也可以将节流器改造成类的形式,将计时器句柄作为私有变量存放在类内部。

相关推荐