职责链模式

责任链模式是一种设计模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

模式作用:

  1. dom的冒泡有些类似职责链
  2. nodejs当controller有很多负责操作逻辑的时候拆分中间件
  3. 解耦发送者和接收者

注意事项:

  1. JavaScript中的每一次【.】是有代价的,在有必要的时候应用
    阅读全文 »

模版方法模式

模版方法是一种只需使用继承就可以实现的非常简单的模式
模版方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类.通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序.子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法

模式作用:

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  2. 各子类中公共的行为应被提取出来并集中到一个公共父类中,避免代码重复,不同之处分离为新的操作,最后用一个钩子的模版方法来替换这些不同的代码
  3. 控制子类扩展,模版方法只在特定点调用”hook”操作,这样就允许在这些点进行扩展

注意事项

  1. 和策略模式不同,模版方法使用继承来改变算法的一部分,而策略模式使用委托来改变整个算法
阅读全文 »

策略模式

策略模式定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让方法的变化不会影响到使用算法的客户

模式作用:

  1. 所有的这些算法都是做相同的事情,只是实现不同。
  2. 以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合。
  3. 单独定义算法类,也方便了单元测试。

注意事项:

  1. 不仅可以封装算法,也可以用来封装几乎任何类型的规则,是要在分析过程中需要在不同时间应用不同的业务规则,就可以考虑是要策略模式来处理各种变化。
阅读全文 »

中介者模式

中介者模式(Mediator Pattern):定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。
(注意:中介者模式和代理模式字面意思相近,但却是完全不同的模式)

模式作用:

  1. 在软件开发中,中介者是一个行为设计模式,通过提供一个统一的接口让系统不同部分进行通信.一般,如果系统有很多子模块需要直接沟通,都要创建一个中央控制点让其各模块通过中央控制点进行交互.中介者模式可以让这些子模块不需要直接沟通,从而达到进行解耦的目的.

注意事项:

  1. 当系统出现了多对多交互复杂的对象群时,先不急于使用中介者模式,而是思考一下是不是系统设计有问题.
阅读全文 »

按值传递 VS. 按引用传递

按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。

按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数形参的值如果被修改,实参也会被修改。同时两者指向相同的值。

按引用传递会使函数调用的追踪更加困难,有时也会引起一些微妙的BUG。

按值传递由于每次都需要克隆副本,对一些复杂类型,性能较低。两种传值方式都有各自的问题。

阅读全文 »

原型模式

原型模式(prototype)是指原型实例指向对象的种类,并且通过拷贝这些原型创建新的对象

模式作用:

  1. 原型对象本身就是有效地利用了每个构造器创建的对象

注意事项:

  1. 注意的依然是浅拷贝和深拷贝的问题,免得出现引用问题
  2. 现有的文献里查看原型模式的定义,没有针对JavaScript的,你可能发现很多讲解的都是关于类的,但是现实情况是基于原型继承的JavaScript完全避免了类(class)的概念
    阅读全文 »

适配器模式

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

模式作用:

  1. 使用一个已经存在的对象,但其方法与接口不符合你的要求
  2. 创建一个可复用的对象,该对象可以与其他不相关或不可见的对象协同工作
  3. 使用一个已经存在的一个或多个对象,但是不能进行继承已匹配它的接口

注意事项:

  1. 与代理模式的区别,代理模式是不改变原接口,适配模式是原接口不符合规范
    阅读全文 »

迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。

模式作用:

  1. 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作
  2. 对于集合内部结果常常变化各异,我们不想暴露其内部结构的话,但又想让客户代码透明地访问其中的元素,这种情况下我们可以使用迭代器模式

注意事项:

  1. 一般的迭代,我们至少要有2个方法,hasNext()和Next(),这样才能做到遍历所有对象
  2. 遍历的同时更改迭代器所在的集合结构可能会导致问题(比如C#的foreach不允许修改item)
    阅读全文 »

外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

模式作用:

  1. 在设计初期,应该有意识地将不同的两个层分离,比如经典的三层结构
  2. 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观模式可以提供一个简单的接口,减少他们之间的依赖
  3. 在维护一个遗留的大型系统时,为系统开发一个外观Facade类,为设计粗糙和高度复杂的遗留代码一共比较清晰的接口,让新系统和Facade类对象交互

注意事项:

  1. 外观模式被开发者连续使用时会产生一定的性能问题,因为每次调用时都要检测功能的可用性(PS:可用函数的惰性加载来解决)
阅读全文 »

单例模式

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

模式作用:

  1. 模块间通信
  2. 系统中某个类的对象只能存在一个
  3. 保护自己的属性和方法

注意事项:

  1. 注意this的使用
    阅读全文 »