设计模式
js
// 单例模式
// 惰性单例
const Singleton = function (name) {};
const getInstance = (function () {
let instance;
return function (name) {
if (!instance) {
instance = new Singleton(name);
}
return instance;
};
})();
// 策略模式
// 定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换
const Strategy = {
A: (num) => {
return 2 * num;
},
B: (num) => {
return 3 * num;
},
C: (num) => {
return 4 * num;
},
};
// 代理模式
// 缓存代理,缓存计算结果
const mult = function () {
return 'result';
};
const proxyMult = (function () {
let cache = {};
return function () {
let args = Array.prototype.join.call(arguments, ',');
if (args in cache) {
return cache[args];
}
return (cache[args] = mult.apply(this, arguments));
};
})();
// 发布-订阅模式(观察者模式):事件模型
class EventEmitter {
constructor() {
this.listeners = new Map();
}
addListener(eventName, callback) {
this.listeners.has(eventName) || this.listeners.set(eventName, callback);
this.listeners.get(eventName).push(callback);
}
removeListener(eventName, callback) {
if (this.listeners.has(eventName)) {
let eventCallbackList = this.listeners.get(eventName);
if (eventCallbackList && eventCallbackList.length) {
let eventCallbackListLength = eventCallbackList.length;
for (let i = 0; i < eventCallbackListLength; i++) {
if (
typeof eventCallbackList[i] === 'function' &&
eventCallbackList[i] === callback
) {
eventCallbackList.splice(i, 1);
this.listeners.set(eventName, eventCallbackList);
return true;
}
}
} else {
return false;
}
}
return false;
}
emit(eventName, ...args) {
if (this.listeners.has(eventName)) {
const eventList = this.listeners.get(eventName);
if (eventList && eventList.length) {
eventList.forEach((callbackItem) => {
callbackItem(...args);
});
return true;
} else {
return false;
}
}
}
}
// 模板模式
class Modal {
constructor() {}
show() {
console.log('show modal');
}
hide() {}
}
class WarningModal extends Modal {
constructor() {
super();
}
show() {
console.log('show warning modal');
}
}
// 享元模式,对象池
// 性能优化方案
const objectFactory = function (createObjectFn) {
let objectPool = [];
return {
create: () => {
var obj =
objectPool.length === 0
? createObjectFn.apply(this, arguments)
: objectPool.shift();
return obj;
},
recover: (obj) => {
objectPool.push(obj);
},
};
};
// 使用
const iframeFactory = objectFactory(() => {
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.onload = function () {
iframe.onload = null; // 防止 iframe 重复加载的 bug
iframeFactory.recover(iframe); // iframe 加载完成之后回收节点
};
return iframe;
});
// 装饰者模式
// AOP装饰函数
Function.prototype.before = function (beforeFn) {
let that = this;
return function () {
beforeFn.apply(this, arguments); //先执行beforeFn
return that.apply(this, arguments); //再执行当前函数
};
};
Function.prototype.after = function (afterFn) {
let that = this;
return function () {
let ret = that.apply(this, arguments); //执行当前函数
afterFn.apply(this, arguments);
return ret;
};
};
// 适配器模式
// 如:数据结构之间的转化