# 常用设计模式
# 策略模式
- 先配置策略
const type = {
checkRole: (value) => {
return value === "juejin";
},
checkLevel: (value) => {
return value >= 1;
},
checkjob: (value) => {
return value === "前端";
},
};
let Validator = function () {
this.caches = [];
this.add = (method, value) => {
this.caches.push(() => {
return type[method](value);
});
};
this.check = () => {
let res = true;
this.caches.forEach((el) => {
res = el();
if (!res) {
return false;
}
});
return res;
};
};
- 验证
var compose1 = () => {
var validator = new Validator();
const data1 = {
role: "juejin",
level: 3,
};
validator.add("checkRole", data1.role);
validator.add("checkLevel", data1.level);
const result = validator.check();
console.log(result);
return result;
};
# 什么时候用策略模式?
- 各判断条件下的策略相互独立且可复用
- 策略内部逻辑相对复杂
- 策略需要灵活组合
# 发布订阅模式
const EventEmit = function() {
this.events = {};
this.on = function(name, cb) {
if (this.events[name]) {
this.events[name].push(cb);
} else {
this.events[name] = [cb];
}
};
this.trigger = function(name, ...arg) {
if (this.events[name]) {
this.events[name].forEach(eventListener => {
eventListener(...arg);
});
}
};
};
vue 的话会加入proxy 来代理对象实现当对象get或set 时的触发更新
# 适用范围
各模块相互独立 存在一对多的依赖关系 依赖模块不稳定、依赖关系不稳定 各模块由不同的人员、团队开发
# 装饰器模式
不改变原有函数的功能 比如 高阶组件 HOC,一些插件的日志,一般会放在 func 的属性上
# 适配器模式
将不同的数据结构转换成统一的数据结构
# 代理模式
事件代理
// 本体
var domImage = (function() {
var imgEle = document.createElement('img');
document.body.appendChild(imgEle);
return {
setSrc: function(src) {
imgEle.src = src;
}
};
})();
// 代理
var proxyImage = (function() {
var img = new Image();
img.onload = function() {
domImage.setSrc(this.src); // 图片加载完设置真实图片src
};
return {
setSrc: function(src) {
domImage.setSrc('./loading.gif'); // 预先设置图片src为loading图
img.src = src;
}
};
})();
// 外部调用
proxyImage.setSrc('./product.png');
# 适用范围
- 模块职责单一且可复用
- 两个模块间的交互需要一定限制关系
# 责任链模式
举例 .then().then()
# 适用范围
- 你负责的是一个完整流程,或你只负责流程中的某个环节
- 各环节可复用
- 各环节有一定的执行顺序
- 各环节可重组