1. 程式人生 > >訂閱發布模式概念基礎

訂閱發布模式概念基礎

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>

訂閱發布模式概念基礎