Analysis Pattern: Ajuste por Substituição (Replacement Adjustment)

O que é

Detalhes de funcionamento

Quando deve ser usado

Código exemplo

class EventoContabil {
private EventoContabil eventoAjustado, eventoSubstituto;
public EventoContabil(
TipoEvento tipo,
Calendar quandoOcorreu,
Calendar quandoObservado,
EventoContabil eventoAjustado) {
if (eventoAjustado.jaFoiAjustado())
throw new IllegalArgumentException(
"Nao pode criar "
+ this
+ "."
+ eventoAjustado
+ "ja foi ajustado");
this.tipo = tipo;
this.quandoOcorreu = quandoOcorreu;
this.quandoObservado = quandoObservado;
this.eventoAjustado = eventoAjustado;
eventoAjustado.eventoSubstituto = this;
}
protected boolean jaFoiAjustado() {
return (eventoSubstituto != null);
}
}
class EventoContabil {
...
public void processa() {
assert(!foiProcessado); // Nao pode processar um evento duas vezes
if (eventoAjustado != null)
eventoAjustado.undo();
acharRegra().processa(this);
foiProcessado = true;
}
public void undo() {
Lancamento[] lancamentos = getLancamentosResultantes();
for (int i = 0; i < lancamentos.length; i++)
getSubject().removeLancamento(lancamentos[i]);
undoEventosSecundarios();
lancamentosResultantes = null;
}
private void undoEventosSecundarios() {
Iterator it = getEventosSecundarios().iterator();
while (it.hasNext()) {
EventoContabil umLancamento = (EventoContabil) it.next();
umLancamento.undo();
}
}
}

programa