Wiring de eventos entre componentes

Meu probleminha é o seguinte, estou refatorando meu código de GUI em pequenos componentes reusaveis, a dúvida é sobre como fazer o wiring entre os vários componentes.

Via de regra tenho um objeto com todo o glue code para um caso de uso, ou seja, instancia e configura os componentes GUI. A questão é que a maioria deles costumam espor 1-2 valores e depender de outros. O pepino disso é que as fontes e os destinos desses desses valores mudam muito.

Hoje minha solução envolve os componentes implementarem PropertyChangeListener e um mediador adicionar eles para escutar notificações pertinentes. Um problema disso é que eu trato os eventos de acordo com o tipo da propriedade que mudou, isso meio que cheira mal, o outro é que os componentes tem que estar preparados para receber os eventos.

Ou seja, o código hoje parece +/- com:

Mediador...

void createComposite() {
   a = new ComponenteA();
   b = new ComponenteB();
   
   a.addPropertyChangeListener("X", b);
}


ComponenteA...

void setX(IJavaElement x) {
  int oldX = this.x;
  this.x = x;
  support.firePropertyChange("X", oldX, x);
}

ComponenteB...

void propertyChange(PropertyChangeEvent evt) {
   if(isPropertyOfType(evt, IJavaElement.class))
    setJavaElement((IJavaElement)evt.getNewValue());
}

Funciona mas fico na dúvida se não seria melhor fazer algo +/- assim:

Mediador...

void createComposite() {
   a = new ComponenteA();
   b = new ComponenteB();
   
  bind(a, "X", b, "javaElement");
}


void bind(IPropertySouce a, String source, Object b, String dest) {
   Object listener = EventHandler.create(PropertyChangeListener.class, b, dest, "newValue");
   a.addPropertyChangeListener(source, (PropertyChangeListener)listener);
}

A idéia é que o Mediador que se vire para entregar o valor ao componente b. Oque tou achando de ruim nisso é que usar composição de componentes fique mais complexo

Olá

Louds, sem examinar muito seu código mas pegando no ar a questão de que os componentes dependem entre si, me vieram a mente 2 patterns GoFianos: chain of responsabilities e observer. Será que esta idéia ajuda em algo?

[]s
Luca

[quote=Luca]Olá

Louds, sem examinar muito seu código mas pegando no ar a questão de que os componentes dependem entre si, me veio a mente 2 patterns GoFianos: chain of responsabilities e observer. Será que esta idéia ajuda em algo?

[]s
Luca[/quote]

O problema é que os componentes não dependem entre sí, mas sim de valores que podem vir de fontes completamente diferentes.

Olá

É, reli com mais calma e vi que vc falou que depende de outros e eu entendi dependência entre si.

O modelo de Container do swing é interessante mas eu não recomendaria nem para minha sogra. É dificil tentar advinhar o que pode ser melhor no seu caso. Só me resta ficar lançando idéias ao vento que foi o que fiz no post anterior.

Como está em meio ao processo de refatoramento acho que você mesmo vai descobrir o que é melhor. Só vou lembrar da regra de três do Martin Fowler: na primeira vez você apenas faz, na segunda vez que faz parecido estremece mas faz de novo e na terceira vez parecido chuta o balde e refatora. Então por enquanto deixe como está e siga o processo de refatoração por fora disto. Pode ser que mais adiante vá perceber com mais clareza qual o melhor caminho a adotar.

[]s
Luca

Viajei no que tu falou louds. Não entedi nada.
Vc quer amarrar dois componentes e qdo um alterar, ou outro pega o valor tb ? :expressionless:

Bruno, mais ou menos isso.

Os componentes dependem de valores que vem de fontes não determinadas.

Meu atual exemplo é um componente para seleção de tipo java (pense na linha de escolher o super tipo no wizard de criação de classes).

Ele depende do projeto e do pacote atual. No wizard de criação de classes esses dois valores vem de outros dois componentes, no wizard que estou criando o primeiro é constante e o segundo vem de outro componente.

Ou seja, é +/- oque você falou, 2 componentes, quando um alterar, o outro pega o novo valor. Mas sem amarrar eles explicitamente.

Será que inputMap / actionMap com clientProperty não ajuda ?

Dai vc pode pegar as ações em cima dos componentes e setar algum valor pro outro componente.

[quote=brlima]Será que inputMap / actionMap com clientProperty não ajuda ?

Dai vc pode pegar as ações em cima dos componentes e setar algum valor pro outro componente.[/quote]

Hmm, tou usando SWT então fica complicado usar isso :wink:

De qualquer forma valeu, vou dar uma olhada mais a fundo em como seria o equivalente pro SWT/JFaces.