设计模式是在面向对象软件设计开发中,针对特定问题的简洁而优雅的解决方案; ——-《设计模式:可复用面向对象软件的基础》

设计模式的前提知识:

1.面向对象编程的原型;
javascript由于动态语言,弱类型,而且没有类的概念,class也是基于原型的语法糖;

多态:同一操作对于不同的对象有着不一样的行为和结果。

2.多态和封装;
3.js的原型模式和基于原型的对象系统;
4.js中的指针,call和apply和bind;
5.闭包和高阶函数;

闭包的优缺点:1.使某个对象常驻内存;2.减少对全局对象的污染;3.作为一个私有变量使用; 缺点是:容易导致内存溢出;

什么是高阶函数:满足两点中的一点:1、将函数作为参数传递,2.返回值为一个函数; 函数currying:1.参数复用;2.提前确认;3.延迟执行;

常用的设计模式

1. 单例模式:

什么是单例模式:
单例模式是每个类只对应一个实例,提供一个全局访问的入口;最常用的:惰性单例模式

  1. function getSingle(fn){
  2. var result;
  3. return function(){
  4. return result || (result = fn.apply(this,arguments))
  5. }
  6. }

单例模式使用了闭包和高阶函数;

2. 策略模式:

什么是策略模式:定义一些列的算法,把他们封装起来,然后可以互相替换;
优点:利用组合和委托和多态等技术,可以有效的避免多重条件选择语句;完美实现了开放-封闭原则,将算法封装在独立的类中;
缺点:创建许多的算法类;

3. 代理模式

通过代理来决定是否可以访问主体;
保护代理:有权拒绝访问;
虚拟代理:在合适的时机访问主体;

4. 发布订阅模式(观察者模式)

通过订阅事件,在发布事件的时候可以执行订阅事件的回调函数,来达到对象之间的解耦;

  1. 命令模式
  2. 组合模式

组合模式就是用小的对象构建大的对象;

7.Template 模式(模板方法模式)

其实是利用了抽象类和抽象方法,在创建子类时必须要实现抽象类和方法;
优点:模板方法通过继承的方式实现封装变化提高扩展性;它也满足开放-封闭原则;

8. 享元模式

减少类的数量,重用可用的类,用于减小内存占用,是一种性能优化的设计模式;

9. 职责链模式

使多个对象都有机会处理请求,对象形成了一条链,请求沿着链向下传递,知道某个对象处理请求;

10. 中介者模式

通过中介者模式,可以松散对象之间的耦合,对象通过与中介者联系,通过中介者发布事件,由原来的多对多联系改为一对多的关系;
缺点:对象之间的耦合性降低,交互逻辑都放了中介对象中,必然造成中介对象难以维护;
中介者模式是迎合最少知识原则的一种设计模式;对象尽量不接触其他对象;

11. 装饰者模式

实现AOP(面向切面编程)的一种设计模式;

AOP(面向切面编程):将一些公用的非业务类型的功能代码抽离出来,比如日志,错误校验,通过动态织入的方式,不侵入源代码的方式增加新的功能;

装饰器:装饰器可以装饰类,方法,参数

  1. 状态模式

什么是状态模式:状态模式的关键是区分事物内部的状态,状态的改变会导致行为的改变;

设计模式的原则

  1. 单一职责原则

尽量保证对象实现的功能单一,这能减小对象之前的耦合;实现的模式:策略模式、发布订阅模式;
优缺点:
优点是降低对象实现的复杂度,按照职责将对象拆分成细粒度的模块,这有助于代码的复用和单元测试;
缺点就是,对象实现的复杂度降低了,但是对象之间的耦合度确增高了,针对不同的应用环境,如何把握恰当的单一职责而且提高模块内部的额高内聚,达到平衡;

  1. 最少知识原则

将对象之间的联系限制在最小的范围内,最少的接触其它对象,实现的模式典型的有:中介者模式;

  1. 开放-封闭原则

    开放-封闭原则的核心是:软件设计中,软件实体(类,模块,函数)应该是可以扩展的,但是不可修改;

开放-封闭原则,在不改变源码的基础上,对对象实现封装;实现模式有:发布订阅模式、职责链模式、策略模式、代理模式、模板方法模式(封装变化);
优缺点:有点是减少对象之间的耦合,再不通过修改源码的基础上,实现包装和功能织入;
面向接口编程:
(typescript)面向接口编程语言层面的支持:
TS提供了class抽象类的实现和interface;

  1. 抽象类和接口之间的相同点:

抽象类和接口都对变化做了封装

  1. 抽象类和接口的不同点:

不同是,抽象类只能继承一个,而接口可以实现(继承)多个;抽象类中提供了一些具体的实现和逻辑的方法,规定了子类中的行为,抽象方法需要子类重实现不同的功能;接口中定义了属性或方法的类型,是更为抽象的封装,只关注行为方面的抽闲,不关心具体的实现;