訂閱發布模式概念基礎
阿新 • • 發佈:2018-10-13
cti 管理 listen function const 概念 訂閱 col 沒有
- 讓寫出的代碼具有可維護性,可復用性,可移植性。不再專註於代碼本身,而是站在宏觀的角度思考代碼,想如何規劃和管理代碼
- 代碼至少滿足"低耦合 高內聚"
- 低耦合:每個模塊之間的代碼沒有關聯性
- 高內聚:每個模塊代碼都是由關聯性很強的代碼組成,都是用來實現單一的功能,得遵守單一職責的原理
- 如何將單獨的功能在需要執行的地方執行 ->訂閱發布模式
訂閱 :做計劃
發布 :執行計劃
取訂閱 :取消計劃
function fn1(){} function fn2(){} document.addEventListener(‘click‘,fn1,false); document.addEventListener(‘click‘,fn2,false); document.removeEventListener(‘click‘,fn2,false);
鼠標點擊這件事發生時:
做計劃:對事件添加綁定的行為fn1,fn2
取消計劃:對事件解除綁定的行為fn2
執行計劃:用戶點擊時
訂閱發布模式的基礎練習:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="div1"></div> </body> </html> <script> //做計劃 on //取消計劃 off //執行計劃 fire let oDiv = document.getElementById(‘div1‘); function fn1() { alert(‘第一個方法‘); } function fn2() { alert(‘第二個方法‘); } function fn3() { alert(‘第三個方法‘); } on(oDiv,‘marry‘,fn1); on(oDiv,‘marry‘,fn2); on(oDiv,‘marry‘,fn3); off(oDiv,‘marry‘,fn3); window.setTimeout(function(){ fire.call(oDiv,‘marry‘); },1000); function on(ele,type,fn){ //有個事件池,放著跟事件相關的行為 //如何定義跟事件類型相關的事件池(數組)ele[‘my‘+type] +‘my‘為了和系統事件區分 if(!ele[‘my‘+type]) { ele[‘my‘ + type] = []; } let a = ele[‘my‘+type]; a.forEach(function (item,index) { //處理重復綁定 if(item === fn) return; }) a.push(fn);//把每個行為放在於事件相關的事件池中 } function off(ele,type,fn){ //1.獲取事件池 let a = ele[‘my‘ + type]; //遍歷事件池 是否有這個計劃 if(a && a.length > 0) { a.forEach(function (item, index) { if (item === fn) { //防止數組發生塌陷,假移除 a[index] = null; } })} // for(let i = 0; i < a.length; i++){ // if(a[i] === fn){ // a[i] = null; // } // } // } } function fire(type){//發布計劃 把事件池中的計劃取消 let a = this[‘my‘ + type]; if(a && a.length > 0){ for(let i = 0; i < a.length; i++){ if(typeof a[i] === ‘function‘){ a[i].call(this); }else{ a.splice(i,1); i--; } } } } </script>
訂閱發布模式概念基礎