Já ouviu falar de design patterns?
Conhece o padrão observer?
Leia:
http://www.dofactory.com/Patterns/PatternObserver.aspx ,
http://en.wikipedia.org/wiki/Observer_pattern
Muitas vezes precisamos recorrer aos design patterns para resolver alguns problemas
comuns do nosso dia a dia.
Existem muitos tipos de implementações desses designs e muitas vezes, alguns não
se adequam às necessidades reais.
Temos que ter em mente o seguinte:
1 compreender o problema;
2 entender o design pattern;
3 entender como o padrão resolverá o problema.
Vamos ver uma implementação do padrão Observer em javascript.
/** ----------------------------------------------------------------------------
* Implementacao de um observer (singleton)
* Ex:
* var a = {}, b={}, c={}, obs=Observer.getInstance();
* obs.addObserver('notifyA',a,function(target){console.log(target)})
* obs.addObserver('notifyB',b,function(target){console.log(target)})
* obs.addObserver('notifyC',c,function(target){console.log(target)})
*
* obs.notifyAll(); // notifica todos
* obs.notify('notifyB'); // notifica os objetos que possuem o evento 'notifyB'
* obs.notifyObj(c); // notifica um objeto especifico
*
* @return {*}
* @constructor
*/
function
Observer(){
var
slf=Observer;
// singleton pattern
if
(slf.instance)
return
slf.instance;
slf.instance=
this
;
var
_observers={},
_getSizeOfObservers=
function
(){
return
Object.keys(_observers).length;};
/**
* Adiciona um observer para um objeto passado.
* @param {String} name Nome do evento
* @param {Object} obj Objeto que observara o evento
* @param {Function} func Callback do evento
*/
this
.addObserver=
function
(name, obj, func){
if
(name &&
typeof
(obj) ==
"object"
&&
typeof
(func)==
"function"
){
if
(!obj.gid) obj.gid=Object.gid();
name=
'%ev-'
+name+
'%id-'
+obj.gid+
'%len-'
+_getSizeOfObservers();
_observers[name]={obj:obj,func:func};
}
};
/**
* Remove um observer
* @param {String} name Nome do evento
* @param {Object} obj Objeto que esta na lista de observers
*/
this
.removeObserver=
function
(name,obj){
if
(name &&
typeof
(obj) ==
"object"
){
if
(!obj.gid)
return
;
name=
'%ev-'
+name+
'%id-'
+obj.gid;
for
(
var
i
in
_observers){
if
(i.indexOf(name)>-1)
delete
_observers[i];
}
}
};
/**
* Notifica todos os elementos que estao na lista de _observers
*/
this
.notifyAll=
function
(){
for
(
var
i
in
_observers)
if
(_observers[i].func) _observers[i].func(_observers[i].obj);
};
/**
* Notifica um objeto especifico
* @param {Object} obj
*/
this
.notifyObj=
function
(obj){
for
(
var
i
in
_observers)
if
(_observers[i].obj && _observers[i].obj.gid == obj.gid)
_observers[i].func(_observers[i].obj);
};
/**
* Notifica os objetos que aguardam um evento qualquer
* @param {String} name Nome do evento
*/
this
.notify=
function
(name){
for
(
var
i
in
_observers)
if
(i.indexOf(name)>-1 && _observers[i].obj)
_observers[i].func(_observers[i].obj);
};
}
/**
* Retorna a instancia (singleton)
* @return {Observer}
*/
Observer.getInstance=
function
(){
if
(
this
.instance)
return
this
.instance;
return
new
Observer();
};
Note que é uma simples implementação onde o subject é inserido em uma lista
de observers no objeto Observer, mas que serve muito bem ao propósito.
Mas não segue o padrão apresentado!
Não mesmo, mas temos todos os elementos envolvidos agindo e reagindo conforme
esperado no padrão.
Nenhum comentário:
Postar um comentário