通常都是在事件訂閱端註冊和取消註冊的,比如說
事件發布端:
public class publisher
else}}
事件訂閱端:
public class subscriber
public void unsubscribesomeevent(publisher publisher)
public void onsomeevent(object arg1, object arg2)
", this.gettype().name);}}
如果有一堆訂閱事件的:
public class subscriber1 : subscriber
public class subscriber2 : subscriber
public class subscriber3 : subscriber
public class subscriber4 : subscriber
public class subscriber5 : subscriber
//...
先寫點**執行一下:
publisher publisher = new publisher();
subscriber1 subscriber1 = new subscriber1();
subscriber2 subscriber2 = new subscriber2();
subscriber3 subscriber3 = new subscriber3();
subscriber4 subscriber4 = new subscriber4();
subscriber5 subscriber5 = new subscriber5();
subscriber1.subscribesomeevent(publisher);
subscriber2.subscribesomeevent(publisher);
subscriber3.subscribesomeevent(publisher);
subscriber4.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
publisher.firesomeevent();
其中5號訂閱者重複訂閱了多次事件。
執行結果:
如果說這群訂閱者還都不主動取消訂閱事件,(據說)就會造成記憶體洩漏或者相關的物件無法釋放等問題。
但是如果訂閱者都比較分散,東乙個西乙個的,找起來不一定能找的到,如果釋放事件發布端,可能會帶來一定問題(別問我會帶來啥問題也別問我為啥要釋放事件發布端,我不知道
如果說在事件發布端有個方法能夠「清除」掉所有事件訂閱豈不很爽?
那麼只需要在事件發布端加上這麼乙個方法(方法來自 stackoverflow 最後乙個回答):
public void unsubscribeallsomeevent()}}
來測試一下:
publisher publisher = new publisher();
subscriber1 subscriber1 = new subscriber1();
subscriber2 subscriber2 = new subscriber2();
subscriber3 subscriber3 = new subscriber3();
subscriber4 subscriber4 = new subscriber4();
subscriber5 subscriber5 = new subscriber5();
subscriber1.subscribesomeevent(publisher);
subscriber2.subscribesomeevent(publisher);
subscriber3.subscribesomeevent(publisher);
subscriber4.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
subscriber5.subscribesomeevent(publisher);
publisher.firesomeevent();
publisher.unsubscribeallsomeevent();
console.writeline();
console.writeline("all subscribers unsubscribed some event");
console.writeline();
publisher.firesomeevent();
測試結果:
可見是有效的。不知道為啥那個回答被人踩了。。
input text所有事件
text 物件事件 onblur 當 text field失去聚焦的時候執行一些 onchange 當 text field失去聚焦並且它的值發生變動的時候執行一些 onclick 當使用者在 text field中用滑鼠左鍵點選時執行一些 onfocus 當 text field獲得聚焦的時候執行...
JavaScript事件發布 訂閱
1 發布 訂閱模式也是諸多設計模式當中的一種 2 這種方式可以在es5下相當優雅地處理非同步操作 3 什麼是發布 訂閱呢?我們舉個栗子 假設fn1,fn2,fn3都可以視作乙個事件的發布者,執行它,就會發布乙個事件。這個時候,我們可以通過乙個事件的訂閱者去批量訂閱並處理這些事件,包括它們的先後順序。...
訂閱發布模式 事件
實現訂閱發布模式的基本思路 訂閱者把自己想訂閱的事件註冊到排程中心,所以第一步應該先實現訂閱者到排程中心的方法。訂閱方法 排程中心統一排程訂閱者註冊到排程中心的處理 發布方法 訂閱者取消訂閱事件 取消訂閱方法 直接附上 var pubsub one function evt,fn,ctx off f...