Skip to content

Instantly share code, notes, and snippets.

@alexduarte
Created December 21, 2011 03:38
Show Gist options
  • Save alexduarte/1504451 to your computer and use it in GitHub Desktop.
Save alexduarte/1504451 to your computer and use it in GitHub Desktop.
public class Orcamento {
protected double valor;
protected EstadoDeUmOrcamento estadoAtual;
public Orcamento(){
this.estadoAtual = new EmAprovacao();
}
public Orcamento(double valor){
this.valor = valor;
}
public void aplicaDescontoExtra(){
estadoAtual.aplicaDescontoExtra(this);
}
public void aprova(){
estadoAtual.aprova(this);
}
public void reprova(){
estadoAtual.reprova(this);
}
public void finaliza(){
estadoAtual.finaliza(this);
}
public double getValor(){
return valor;
}
}
public interface EstadoDeUmOrcamento {
void aplicaDescontoExtra(Orcamento orcamento);
void aprova(Orcamento orcamento);
void reprova(Orcamento orcamento);
void finaliza(Orcamento orcamento);
}
public class Aprovado implements EstadoDeUmOrcamento {
public void aplicaDescontoExtra(Orcamento orcamento) {
orcamento.valor -= orcamento.valor * 0.02;
}
public void aprova(Orcamento orcamento) {
throw new RuntimeException("Orçamento aprovado!!");
}
public void reprova(Orcamento orcamento) {
throw new RuntimeException("Orcamento aprovado não pode ser reprovado!!");
}
public void finaliza(Orcamento orcamento) {
orcamento.estadoAtual = new Finalizado();
}
}
public class EmAprovacao implements EstadoDeUmOrcamento {
public void aplicaDescontoExtra(Orcamento orcamento) {
orcamento.valor -= orcamento.valor*0.05;
}
public void aprova(Orcamento orcamento) {
orcamento.estadoAtual = new Aprovado();
}
public void reprova(Orcamento orcamento) {
orcamento.estadoAtual = new Reprovado();
}
@Override
public void finaliza(Orcamento orcamento) {
throw new RuntimeException("Orcamento em aprovação nao pode ir para finalizado!!!");
}
}
public class Finalizado implements EstadoDeUmOrcamento {
public void aplicaDescontoExtra(Orcamento orcamento) {
throw new RuntimeException("Orçamentos finalizados não recebem desconto!!");
}
public void aprova(Orcamento orcamento) {
throw new RuntimeException("Orçamento finalizado!");
}
public void reprova(Orcamento orcamento) {
throw new RuntimeException("Orçamento finalizado!");
}
public void finaliza(Orcamento orcamento) {
throw new RuntimeException("Orçamento finalizado!");
}
}
public class Reprovado implements EstadoDeUmOrcamento {
public void aplicaDescontoExtra(Orcamento orcamento) {
throw new RuntimeException("Orçamentos reprovados não recebem desconto!");
}
@Override
public void aprova(Orcamento orcamento) {
throw new RuntimeException("Orçamento reprovado!");
}
@Override
public void reprova(Orcamento orcamento) {
throw new RuntimeException("Orçamento reprovado!");
}
public void finaliza(Orcamento orcamento) {
orcamento.estadoAtual = new Finalizado();
}
}
public class TestaDescontoExtra {
public static void main(String[] args) {
Orcamento reforma = new Orcamento(500.0);
reforma.aplicaDescontoExtra();
System.out.println(reforma.getValor()); // imprime 475,00 pois descontou 5%
reforma.aprova(); // aprova nota!
reforma.aplicaDescontoExtra();
System.out.println(reforma.getValor()); // imprime 465,50 pois descontou 2%
reforma.finaliza();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment