Tenho um problema. Queria aplicar o Padrao Observer aqui num programa. Tenho uma classe controller UI e uma classa CalcularPreços. O que eu queria era sempre que fosse invocado um addPrecos dentro dessa classe, fosse mostrado no ControllerUI uma mensagem. Como poderei estruturar isto ? Tenho que ter um interface Observer, e qual vai ser o meu subject?
Vai aumentar o acoplamento, mas aqui vai minha opinião: cadastre essa UI (e as outras que você precisa e quer) no classe que calcula esses preços (ou na classe que faz a interface com essa função). Quando chamar o addPreco, passa pela lista notificando as UIs que o preço foi modificado (aí atualiza elas).
Algo assim:
// classe que calcula os preçosList<JDialog>uis=newArrayList<JDialog>();// ...publicvoidcadastrarUi(JDialogjanela){uis.add(janela);}// ...publicvoidaddPreco(doublepreco){this.preco+=preco;notificarUis();}privatevoidnotificarUis(){for(JDialogjanela:uis){janela.atualizarPreco(this.preco);}}
Eu não gosto muito do Observer pra esses casos, mas é uma saída. Outra saída é você obrigar o usuário a sempre clicar num botão de atualizar. Não conheço muito bem Swing, mas acho que outra saída é você colocar essa parte que atualiza no paintComponent das suas janelas (alguém que conhece Swing sabe me dizer se é boa prática isso?). Outra ainda é fazer uma Thread que fica verificando de tempos em tempos se o preço mudou. Mas acho que isso vai comer um bom processamento.
Flavio_Almeida
CDI tem facilitades para o uso do pattern Observer.