Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida sobre observer

Estava lendo a documentação do padrão observer e não sei se entendi muito bem..

"An observable is an object which notifies observers about the changes in its state."

No código abaixo, por exemplo, um objeto que referencia a classe NotaFiscalBuilder seria o observable, e os observers seriam os objetos AcaoAposGerarNota?

public class NotaFiscalBuilder {

private String razaoSocial;
private String cnpj;
private LocalDateTime dataDeEmissao;
private double valorBruto;
private double impostos;
public String observacoes;
private List<ItemDaNota> todosItens = new ArrayList<ItemDaNota>();
private List<AcaoAposGerarNota> todasAcoes = new ArrayList();


public NotaFiscalBuilder() {
    this.todasAcoes = new ArrayList<AcaoAposGerarNota>();
}

public void adicionaAcao(AcaoAposGerarNota acao) {
    this.todasAcoes.add(acao);
}

public NotaFiscalBuilder addEmpresa(String razaoSocial) {
    this.razaoSocial = razaoSocial;
    return this;
}

public NotaFiscalBuilder addCNPJ(String cnpj) {
    this.cnpj = cnpj;
    return this;
}

public NotaFiscalBuilder addItem(ItemDaNota item) {
    todosItens.add(item);
    valorBruto += item.getValor();
    impostos += item.getValor() * 0.05;
    return this;
}

public NotaFiscalBuilder addObservacoes(String observacoes) {
    this.observacoes = observacoes;
    return this;
}

public NotaFiscal constroi() {
    NotaFiscal nf = new NotaFiscal(razaoSocial, cnpj, dataDeEmissao, valorBruto, impostos, todosItens, observacoes);
    todasAcoes.forEach((acao) ->
    acao.executa(nf));
    return nf;
    }

} Por fim, o texto menciona o seguinte: "In this implementation, an observable must keep a reference to the PropertyChangeSupport instance."

O que é um PropertyChangeSupport instance? No código acima, seria possível exemplificar?

1 resposta
solução!

O observável deve manter uma instância aos seus observables, em outras palavras, se você tiver um código que queira notificar outros objetos, é interessante manter uma instância a esses objetos que deseja-se notificar. Dessa forma o código observável consegue notificar mais facilmente.

No seu código, por exemplo, o NotaFiscalBuilder pode ser o observável enquanto o "todasAcoes" seria a lista de observables. Uma vez que o estado do seu objeto NotaFiscalBuilder mude com a chamada ao método constroi(), todos os seus observables serão notificados pelo trecho:

todasAcoes.forEach((acao) ->
    acao.executa(nf));
 }