0%

在组合模式中,事件或者对象经过父节点组件处理后,会向下传递给子节点,但是我们常常遇到这样的问题,我们接收到一个事件对象,但由于该对象的变化情况非常多样,如果每次都根据不同的情况做出不同处理,会造成代码上的严重耦合,此时,我们不如让函数自己去判断是否对该对象进行处理,也就是针对某个可变的一系列相似事件,构造一条职责链,职责链的每一节点负责不同的处理方式,甚至职责链的每个节点仍旧是一条职责链,这样就将时间发起者与事件处理者之间的耦合关系大大减弱。

在看到职责链模式的描述的时候,我首先想到的是redux中的reducer,reducer是一种简单的职责链的实现方式,但在构建react应用中发挥了巨大的作用,在每一个reducer中,都负责了不同数据的处理方式,reducer实现事件对象传递是非常粗暴的,即穷举法,对职责链中的每一个节点传入相同的参数然后返回得到的结果集,但得益于switch的高效,这种做法并不会对性能产生太大的影响。

redux中的中间件机制,也可以使用职责链来描述,但中间件之间传递事件对象时,则需要每个中间件将对象返回出去,这就对编写中间件的方式做了默认的约定,即返回结果的形式需要能够被下一级中间件使用。

著名的jQuery以链式调用为一大特色,其中也可以使用职责链模式来解释,只是此时的职责链传递的是事件发起者本身。

在组合模式中运用职责链时,可以将组合后的对象通过职责链连接起来,以优化事件对象的传递方向或者数据的流动方向。

脱离redux来讲,职责链模式的应用范围非常广泛,实现方式也是多种多样,但应当注意的是,职责链的每个节点应该各司其职,不要在某个职责链节点中调用相同职责链的其他节点,以免出现耦合,同时将事件处理流程的粒度进行细化。

在构建JavaScript应用的过程中,对象的创建是一种非常普遍的解决需求的方式,合理地使用对象可以让代码更加有秩序,程序执行效率更高,但是对象在创建后会占据一定的内存空间,倘若在短时间内创建大量的对象,会使得浏览器卡顿甚至陷入假死状态,因此,我们需要对对象进行优化,重用以及共享,俗语道“不当家不知柴米贵”,在浏览器中运行的程序,对内存的要求不能太高,否则会因为浏览器或者电脑的性能瓶颈导致页面体验不佳。
使用享元模式可以在以下场景中使得程序的内存占用得到优化:

1.同一功能模块中使用了大量的相似对象
2.由于这些对象的使用造成了很大的内存开销
3.对象的大多数状态可以变为外部状态
4.抽离出外部状态后,可以使用少量的共享对象代替外部对象
Read more »

前面五小节中,我们学习了使用defaultdict(list/set)来初始化可以一个键保存多个值的字典、使用OrderedDict来创建在读取时能够保持插入顺序的字典、使用zip处理键值对以方便对字典进行简单地计算(min、max、sorted)以及对dict.keys()和dict.items()进行集合运算(&/-)和利用set和generator在保持字典内容顺序的同时删除字典中特定部分重复的内容。

Read more »

第一章主要包含的内容是以数据结构为主,在前五节中主要了解了解构赋值和解构赋值中占位符_*的使用方法,以及在保留有限个数的元素时dequeue的用法,最后是学习了heapq的使用情境及方法

Read more »

chapter1 数据结构和算法

python内置了许多有用的数据结构,比如list,set,dictionarie,大部分时候我们只是直接的使用这些结构,但是,当面对类似搜索、排序、筛选、赋值等操作时,会遇到仅仅依靠数据结构无法解决的问题,本章的目的正是讨论这些公有数据结构以及相关的算法知识。

Read more »

如果说react构成了web应用的骨架和血肉,那么redux则是web应用的内循环系统。redux定义了应用中数据流动的方式和细节,支持高度自由的扩展,让应用对数据的控制更加自由多变。

Read more »

今天要讲的是一种叫做模板方法的模式,在传统的面向对象语言中,开发者通常会将共有逻辑抽象出来放在同一个类中调用,而需要这些逻辑的类会去继承共有类中的方法,同时产生一种父类和子类之间的继承关系。在JavaScript中不存在严格的抽象类之间的继承关系,因此这种代码的组织形式可以称之为模板方法。

钩子方法

在模板方法中,会对自身的其他方法进行组合调用,而调用步骤会由于具体的业务场景而出现不同,此时将判断的逻辑抽象出来作为钩子,并根据钩子方法的结果来影响最终模板方法执行的顺序。

好莱坞原则

将调用方法的主动权交给真正执行业务逻辑的一方,保证方法只在真正需要的情况下才进行调用。

关于组合模式,可能要提到数据结构中的树,一棵树由根节点和若干叶节点组成,从这棵树的任意节点,总可以访问到这棵树的另外一个节点。组合模式则是一种形式上与树相似的代码组织方式。不同的是,我们的节点是一个个对象,且这些对象一般都具有公共的接口,也就是说,他们公用一套语言,比如执行某个命令,为某个元素添加属性,删除成员操作等等,这些特性决定了同一颗组合树内部的对象应该具有相似的结构。

组合模式用来解决的问题可以是,当我们想要将多个功能进行组合时,为这些功能提供统一的调用接口,将多个相关的功能之间共有的逻辑抽象到上层节点中进行操作后再有选择地向下传递,这样可以提高程序的执行效率并减少代码的耦合。

关于具体的代码实现,不同场景下运用组合模式的方式非常灵活,比如宏命令中,将多个宏命令再添加至某个宏命令中,这就是一种组合模式。

在组合模式的树形结构中,为了衍生子节点,要求每个节点必须拥有添加子节点的方法,同时,为了在子节点能够保持对父节点的访问,在节点的添加子节点的方法中,应该将本身的引用传递给将要生成的子节点。

刚看到命令模式的时候,感觉这不就是通常写代码的方式吗,单独算作一种模式有什么意义呢?寥寥几行的代码就可以实现的东西为什么要搞这么复杂?
诚然,设计模式起源于强类型的语言,对JavaScript这种动态语言来说,函数可以作为参数四处传递并在任意位置灵活的进行调用,似乎无需显式地构造一个用于命令模式调用的对象,但是,语言内置的命令模式和软件开发过程中的命令模式要解决问题其实是有所不同的,一种语言固然可以使得任何函数都可以被当作命令来调用,但是在团队开发中,我们应该尽可能地使得功能与功能之间的耦合减弱,并对调用接口做出统一的、辨识度高的规范,而设计模式正是一种可以作为团队内部进行高效沟通的桥梁,使得代码更加规范,可读性得到提高。

Read more »

异步是浏览器编程中非常常见的,比如在发起一个网络请求后,我们需要等待请求的结果并据此作出反应,然而,没有人准确知道请求什么时候能够完成,要解决这个问题,就只能以异步的方式来等待请求完成后调用特定的方法。通常我们以回调函数的形式来完成这个过程,但是回调函数有着相当的局限性。

Read more »