工程化
SOLID五大设计原则
- S - 单一职责原则
- O - 开放封闭原则
- L -里氏替换原则
- I - 接口分离原则
- D - 依赖倒置原则
es6 23种设计模式
创建型 (创建对象实例)
结构型
行为型
13、观察者模式 / 发布--订阅模式
14、模板模式 (抽象类 继承实现,与抽象工厂的区别在于工厂可能产生不同对象,如苹果对象,梨对象)
15、策略模式 / 政策模式 (一个调用入口,根据参数不同,调用不同的函数算法,算法的行为是类似的,维护在map里面,可以动态添加新的算法到map里面,有点是可以一定程度上规避if判断,直接根据参数从map中动态获取算法)
16、职责链模式 (每个函数独立功能,并且互相之间能够组成上下游关系,比如 a.setNext(b), 则当a无法满足条件时,自动调用b进行处理,天然是单节点的层级树【链】)
17、状态模式 (在构造函数内部维护一个私有变量,当变量值改变时,调用同样的接口,得到的行为不同)
18、迭代器模式 (使用者不需要关心对象的内部构造,就可以按序访问其中的每个元素。javascript 已提供了很多迭代器,不需要自己实现了,比如 Array 上的 filter、forEach、reduce、flat 等,具有 Symbol.iterator 属性就可以用 for...of 循环遍历它的成员)
19、访问者模式 (当目标类A的使用者不同,如 男人,女人,a.setUser('男'),a.readPaper()得到的结果不同,内部实现是根据不同的user实例,返回不同的结果)
20、备忘录模式 (A是调用者,B是需要备完的目标,C是持久化队列,a实例 从 b实例 获取内部状态,然后存在C队列上,下次a先从C获取属于b的记录,然后调用new B('数据'),或者setXXX 还原b之前的状态,不一定是同一个对象,但是一定状态相同)
21、命令模式 / 事务模式 (属性和行为分开独立封装Ab、Ac,通过调用Ac方法实际上改变Ab的属性,Ab拥有自己的方法和属性,Ac只拥有可以控制Ab属性或方法的方法,很少使用,一般行为属性都封装在一起)
22、解释器模式 (解释某些特殊语法的函数,比如封装一个逆波兰算法,或则传入一个“1+1-1”的字符串,能够以数字进行运算,得出结果。需要区分算法中的终结符【确认结果的符号】和非终结符【等待确认,或则不表示结果的符号,+-*/等,或者【R1=1、R2=2、R3=R1+R2】R1,R2为终结符,R3为非终结符】)
23、中介模式 (降低多个对象和类之间的通信复杂性,比如,100个购房者在无中介的情况下要看50个楼盘,会形成复杂的轨迹,引入中介后,100个购房者只需要通过中介即可获取100个楼盘的信息,中介负责收集和销售这100个楼盘,简化楼盘的买卖,与代理模式的区别在于代理背后只有一个对象,而中介背后有多个对象)
其他型
24、MVC、MVP、MVVM (【MVC,M只关心如何操作数据,V监听M的行为,并更新界面,C接收来自V的事件,并调用M更新数据,同时M通知V更新界面】【MVP,V不监听M,改为监听C,C接收事件调用M修改数据,并得到M的返回结果,然后C通知V更新界面,V与M不再有联系】【MVVM,将P改为VM,V和VM互为订阅者和发布者,当V有变化时,通知VM调用M更新数据,当M结果返回是,通知VM通知V更新界面,而MVP下则V在数据变化时,需要开发者自己通过事件通知P,MVVM则VM已经在V的事件onInput中注册了监听,开发者大多数情况下可以不用自定义事件通知VM】【vue是MVVM,react 非严格上的mvvm,更像mvp】)
25、模块模式 (闭包,ES6 module,CommonJS、AMD、CMD)
26、链模式 (链式调用)
27、中间件 (express 单向管道模型,koa的洋葱模型,定义好规范之后注册的中间接接收到参数都是一样的规范,然后处理之后将参数传给下一个中间件)
创建型演变
工厂模式 将工厂抽象使得工厂类可继承产生子工厂演变成 抽象工厂模式 ,工厂模式创建对象的过程需要一个使用者一步一步的指挥(调用相关函数)演变成 建造者模式