Паттерн: Наблюдатель (Observer)
Исходник: Наблюдатель на javascript, прототипная версия, язык: javascript [code #556, hits: 5785]
автор: - [добавлен: 01.06.2008]
  1. Array.prototype.contains = function(pattern) {
  2. return this.indexOf(pattern) > -1;
  3. };
  4.  
  5. EventDispatcher = function(/* dispatcher */) {
  6. var _listeners = [];
  7. var _dispatcher = arguments[0] || this;
  8.  
  9. this.bindListener = function(event, listener) {
  10. if(!(listener instanceof Object)) {
  11. return;
  12. }
  13. if(!_listeners[event]) {
  14. _listeners[event] = [];
  15. }
  16. _listeners[event].push(listener);
  17. };
  18.  
  19. this.unbindListener = function(event, listener) {
  20. if(_listeners[event] && _listeners[event].contains(listener)) {
  21. _listeners[event].remove(listener);
  22. }
  23. };
  24.  
  25. this.dispatchEvent = function(event) {
  26. if(!_listeners[event]) {
  27. return;
  28. }
  29. for(var i = 0, length = this.listeners[event].length; i < length; i++) {
  30. if(_listeners[event][i] instanceof Function) {
  31. _listeners[event][i](event, _dispatcher);
  32. }
  33. }
  34. };
  35. };
  36.  
  37. /* пример использования */
  38. Step = function(options) {
  39.  
  40. this.eventDispatcher = new EventDispatcher(this);
  41.  
  42. this.bindListener = function(event, listener) {
  43. this.eventDispatcher.bindListener(event, listener);
  44. };
  45.  
  46. this.unbindListener = function(event, listener) {
  47. this.eventDispatcher.unbindListener(event, listener);
  48. };
  49.  
  50. this.setValue = function(value) {
  51. this._value = value;
  52. this.eventDispatcher.dispatchEvent(Step.EVENT_SET_VALUE);
  53. };
  54. };
  55. calc.Step.EVENT_SET_VALUE = 'setvalue';
Реализация наблюдателя на клиенстком javascript-е через прототип.
Таким образом, при использовании компонента EventDispatcher, на любой метод любого объекта легко можно навесить Observer.
Тестировалось на: IE 6.0 SP2, Mozilla FF 1.5, Opera 9.0

+добавить реализацию