Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   паттерн наблюдатель (https://javascript.ru/forum/project/11195-pattern-nablyudatel.html)

jetli13 12.08.2010 14:41

паттерн наблюдатель
 
Хотелось бы выслушать объективную критику по поводу реализации паттерна "наблюдатель"
выставляю основной класс.

тудухи в комментах можно считать вопросами.
спасибо!

/**
* класс "наблюдатель" реализующий работу с кастомными событиями
* @todo подумать над названием класса
* @todo решить проблему с пространством имен Н: событие switchTab может быть у разных объектов
*/
function observer()
{
  this.events = new Array();
  
  /**
  * добавляет наблюдателя
  * @param {string} objName имя объекта наблюдателя
  * @param {string} eventName событие которое отслеживаем
  */
  this.addObserver = function(objName, eventName)
  {
    if (!this.events[eventName])
    {
      this.events[eventName] = new Array();
    }
    
    this.events[eventName].push(objName)
  }
  
  /**
  * оповещает всех наблюдателей о произошедшем событии
  * @param {string} eventName название события
  */
  this.fireEvent = function(eventName)
  {
    var f = eventName.charAt(0).toUpperCase();
    var eventNameUpperFirst = f + eventName.substr(1, eventName.length-1);
    
    for(var i = 0; i < this.events[eventName].length; i++)
    {
      window[this.events[eventName][i]]['on' + eventNameUpperFirst]();
    }
  }
  
  /**
  * удаляет наблюдателя
  * @param {string} objName имя объекта наблюдателя
  * @param {string} eventType событие которое отслеживаем
  */
  this.removeObserver = function(objName, eventType)
  {
    for(var i = 0; i < this.events[eventName].length; i++)
    {
      if (this.events[eventName][i] == objName)
      {
        this.events[eventName][i] = null;
      }
    }
  }
}

var observer = new observer();

Kolyaj 12.08.2010 15:33

Цитата:

Сообщение от jetli13
var observer = new observer();

Оригинально.

Цитата:

Сообщение от jetli13
* @todo подумать над названием класса

С большой буквы.

Цитата:

Сообщение от jetli13
* @todo решить проблему с пространством имен Н: событие switchTab может быть у разных объектов

Зачем? У каждого объекта должен быть свой набор событий, поэтому они не будут пересекаться.

Я не понял, только глобальные функции можно обработчиками сделать чтоли?

jetli13 12.08.2010 15:49

Kolyaj,
Цитата:

Оригинально.
в чем подвох ? )
Цитата:

С большой буквы.
в проекте уже так сложилось хотя в целом согласен
Цитата:

У каждого объекта должен быть свой набор событий
Спорно... но в целом принцип ясен, спасибо
Цитата:

только глобальные функции можно обработчиками сделать чтоли?
нет, обработчики сидят внутри подписавшихся объектов. Сами же объекты должны быть в window
window[this.events[eventName][i]]['on' + eventNameUpperFirst]();


Часовой пояс GMT +3, время: 12:39.