一切设计模式都是为了使代码高聚合,低解耦
1.装饰器模式
在优化旧代码,确保不影响旧代码逻辑时增加新的功能,经常使用。
举例:
旧代码
function Fn(){
console.log(123)
console.log(456) // 要新增的代码,直接新增此行会改变原有逻辑
}
function newFn(){
Fn();
console.log(456) 抽离原有逻辑后再新增新逻辑。
}
2.工厂模式
将实现同一件事的相同代码封装到一个函数里,用这个函数批量复制生产功能,将创建对象的过程单独封装。举例:
创建一个关于人的构造函数
function Person(name,age,type){
this.name = name;
this.age = age
}
const person1 = new Person('小张',18)
const person2 = new Person('小Li',16)
也可通过传递参数进行扩展 根据type不同,构造不同属性
也可称呼为构造器模式。Person这种就叫构造器
3.单例模式
只有一个实例,可以全局访问到,避免频繁创建销毁实例,减少内存占用。举例:
Jquery,或者用变量将实例或dom节点储存下来供全局访问
4.发布订阅模式
发布订阅模式,又叫观察者模式。其实就是定义了一种一对多的依赖关系。多个观察者去监听一个目标对象,当目标对象状态变化时通知所有观察者进行更新。比如emit on,和vue的MVVM原理
class Publisher{
construstor(){
this.subs = []
}
addSubs(fn){
this.subs.push(fn) // 相当于订阅 On
}
notify(){
this.subs.forEach(item => {
item.update(this) //相当于发布 emit
})
}
}
class obsever(){
update(){
console.log(我更新了)
}
}
const pub = new Publishe()
const ob = new Obsever()
pub.addSub(ob)
pub.notify()
5.策略模式
基于算法的封装
举例
const fnMap = {
0:this.get(),
1:this.set();
}
fnMap[type].bind(this)
通过不同的参数执行不同方法,可用Map对象语法进行封装。
6.建造者模式
使用场景:当一个构造函数的参数较多时使用,根据参数进行分类然后分别构建各个部分,最后挂载到对象的属性上。
典型的例子Vue框架,通过不同Vue router Vuex axios实现Vue的各项功能。