então essa sua ideia de passar só que for mudado dae cria um acoplamento mais forte. Porque então o observado teria que notificar observadores diferentes.
é muito mais facil o observado passar uma referência dele para cada observador pegar as informações que interessa a eles.
acho que assim não ta errado. só talvez eu poderia fazer diferente neste caso ?
[quote=ualex]então essa sua ideia de passar só que for mudado dae cria um acoplamento mais forte. Porque então o observado teria que notificar observadores diferentes.
é muito mais facil o observado passar uma referência dele para cada observador pegar as informações que interessa a eles.
acho que assim não ta errado. só talvez eu poderia fazer diferente neste caso ? [/quote]
Vamos lá, devagar.
O Padrão Observer, da GoF, define estas colaborações:
Existe uma variação para múltiplos Assuntos (Subjects), definida assim:
Eu pessoalmente usaria polimorfismo para observar os assuntos, mas parece quee sta variação que a Sun implementou na interface.
Agora vamos ao acoplamento.
Existe uma classe Quadrado:
public class Quadrado implements Assunto{
int aresta;
Cor minhaCor;
public void modificar(int novaAresta, Cor novaCor){
aresta = novaAresta;
minhaCor=novaCor;
}
public void registrarObservador(Observador o){
observadores.add(o);
}
}
Temos dois observadores interessados nesta classe:
public class Tela implements Observador{
public void atualizar(Assunto a){
}
}
public class Calculador implements Observador{
public void atualizar(Assunto a){
}
}
Sendo que Tela está interessado no tamanho da aresta e na cor do quadrado, enquanto Calculador só se interessa pela aresta. Seguindo seu raciocínio, teríamos:
public void modificar(int novaAresta, Cor novaCor){
aresta = novaAresta;
minhaCor=novaCor;
Calculador c = meusOservadores.getCalculador();
c.atualizar(this, aresta);
Tela t = meusObservadores.getTela();
t.atualizar(this, aresta, cor);
}
Esqueça o número de parâmetros por enquanto. A primeira coisa ruim aqui é que a classe observada tem que conhecer seus observadores, afinal ela precisa saber o que eles querem saber dela. Só isso já causou uma dependência totalemnte desnecessária entre o Quadrado e as outras classes, o padrão observer é extamente para evitar isso. Na verdade, qual a diferença disto para:
? Entre uma e outra, zero. A diferença disso para um sistema OO é que quando você lida com objetos, você passa objetos, não parâmetros atômicos que não dizem nada sozinhos, por isso este tipo de coisa vai contra a OO.
Agora vamos ver a implementação normal de um observer:
public class Quadrado{
...
public void modificar(int novaAresta, Cor novaCor){
aresta = novaAresta;
minhaCor=novaCor;
for(int i=0;i<observadores.size;i++)
observadores[i].atualizar(this);
}
}
public class Tela implements Observador{
public void atualizar(Assunto a){
Quadrado q = (Quadrado) a;
dsenharNovaAresta(a.getAresta());
aplicarNovaCor(a.getCor());
}
}
public class Calculador implements Observador{
public void atualizar(Assunto a){
Quadrado q = (Quadrado) a;
recalcular(a.getAresta());
}
}
Assim as classes observadoras dependem do assunto (o que pdoe ser amenizado numa hierarquia de classes bem definida), mas não o contrário.
Você deve:
Evitar passar parâmetros atômicos
Evitar implementar Observer para passar parâmetros, ele nao é bom nisso (nem deveria)
Evitar que sua classe Assunto dependa de seus observadores