觀察者模式
當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都會(huì)得到通知,也簡(jiǎn)稱發(fā)布-訂閱模式。類似微信訂閱公眾號(hào),當(dāng)它有新的文章發(fā)表后,就會(huì)推送給我們所有訂閱的人
優(yōu)點(diǎn):
1.我們無(wú)需關(guān)注公眾號(hào)是否有新的文章發(fā)布
2.我們和公眾號(hào)沒(méi)有強(qiáng)耦合在一起,公眾號(hào)不關(guān)心誰(shuí)訂閱了它
自定義事件
現(xiàn)在我們想要實(shí)現(xiàn)這樣的功能,定義一個(gè)事件,它有以下功能
- 監(jiān)聽(tīng)事件(訂閱公眾號(hào))
- 觸發(fā)事件(公眾號(hào)發(fā)布)
- 移除事件(取消關(guān)注公眾號(hào))
//代碼如下
var Event = (function(){
var list = {},//存儲(chǔ)公眾號(hào)
on,
emit,
remove;
//監(jiān)聽(tīng)事件
on = function(key,fn){
if(!list[key]){
list[key] = [];如果不存在key,創(chuàng)建
}
list[key].push(fn);//將回調(diào)函數(shù)存儲(chǔ)到對(duì)應(yīng)的key
};
//觸發(fā)事件
emit = function(){
var key = Array.prototype.shift.call(arguments);//獲取key值
var msg = list[key];
if(!msg || msg.length === 0){
return false;//不存在對(duì)應(yīng)的回調(diào)函數(shù),返回false
}
for(var i = 0; i < msg.length; i++){
msg[i].apply(this,arguments);//循環(huán)執(zhí)行回調(diào)函數(shù)
}
};
//移除事件
remove = function(key,fn){
var msg = list[key];
if(!msg){
return false;//如果不存在事件 返回false
}
if(!fn){
delete list[key];//沒(méi)有指定的回調(diào)函數(shù),則刪除key 可以理解公眾號(hào)下架了
}else{
for(var i = 0; i < msg.length; i ++){
if(msg[i] === fn){
msg.splice(i, 1);//刪除指定的回調(diào)函數(shù)
}
}
}
};
// 返回對(duì)象
return {
on:on,
emit:emit,
remove:remove
}
})();
var fn = function(data){
console.log(data+"推送消息來(lái)啦~~~")
}
Event.on('click',fn);//訂閱公眾號(hào)
Event.emit('click',"2018.01.15")//發(fā)布公眾號(hào)
Event.remove('click',fn);//取消關(guān)注公眾號(hào)