常用设计模式
前端设计模式
发布订阅模式
class EventEmiter {
constructor() {
this.instance = undefined;
this._events = {};
};
static getInstance() {
if(!this.instance) {
this.instance = new EventEmiter();
}
return this.instance;
}
on(name, callback) {
if(this._events[name]) {
this._events[name].push(callback);
return ;
}
this._events[name] = [callback];
};
emit(name, ...reset) {
if(!this._events[name]) {
return ;
}
this._events[name].forEach(item => {
item.apply(this, reset);
})
};
removeListener(name, callback) {
this._events[name] = this._events[name].filter(item => item !== callback);
};
once(name, callback) {
let that = this;
function one() {
callback.apply(this, arguments);
that.removeListener(name, one);
}
that.on(name, one);
}
}
let test = EventEmiter.getInstance();
console.log(test);
// let Man = EventEmiter.getInstance();
class Man extends EventEmiter {
constructor() {
this.el = 'child';
}
}
let man = Man.getInstance();
console.log('54', man);
man.on('eat', e => {
console.log(e);
})
man.emit('eat', '早饭');
man.once('after', e => {
console.log(e);
});
man.emit('after', '蚂蚱');
man.emit('after', '蜂蜜');
策略模式
/**
* @description 策略模式 与实践
* @since 2019-10-16
* @author chaizhiyang
*/
const strategys = {
isNotEmpty: (value, errorMsg) => {
if (value === '') {
return errorMsg;
}
},
minLength: (value, length, errorMsg) => {
if (value.length < length) {
return errorMsg;
}
},
maxLength: (value, length, errorMsg) => {
if (value.length > length) {
return errorMsg;
}
},
isEqual: (value, value2, errorMsg) => {
if (value !== value2) {
return errorMsg;
}
},
mobileFormat: (value, errorMsg) => {
if (!/(^1[3|5|8][0-9]{9}$)/.test(value)) {
return errorMsg;
}
},
}
class Validator {
constructor() {
this.cache = [];
this.instance = undefined;
}
add(dom, rule , errorMsg) {
let str = rule.split(':');
this.cache.push(function() {
let strate = str.shift();
str.unshift(dom);
str.push(errorMsg);
return strategys[strate].apply(dom, str);
})
};
start() {
for (var i = 0, validatorFunc; (validatorFunc = this.cache[i++]); ) {
var msg = validatorFunc();
if (msg) {
return msg;
}
}
}
}
let validate = new Validator();
validate.add('123', 'minLength:4','最小程度为4个字符,请重新输入');
let result = validate.start();
console.log('68', result);
单例模式
/**
* @description 发布订阅模式
* @since 2019-10-07
* @author gouweicao
*/
class EventEmiter {
constructor() {
this.instance = undefined;
this._events = [];
}
getInstance() {
if(!this.instance) {
this.instance = new EventEmiter();
}
return this.instance;
};
on(name,callback) {
if(!this._events[name]) {
this._events[name].push(callback);
}
this._events[name] = callback;
};
emit(name,...reset) {
if(!this._events[name]) {
return false;
}
this._events[name].forEach(item => {
item.apply(this, reset);
})
};
}
其中getInstance导出单例模式保证该类实例化对象的唯一性
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!