public class TestaEstadoDeConta {
public static void main(String[] args) {
Conta conta = new Conta("Jose");
System.out.println(conta);
//Titular: Jose // Saldo: R$ 0,00 // Estado: Positiva
conta.saca(1);
System.out.println(conta);
//Titular: Jose // Saldo: -R$ 1,00 // Estado: Negativa
conta.deposita(100);
System.out.println(conta);
//Titular: Jose // Saldo: R$ 94,00 // Estado: Positiva
}
}
public class Negativa extends EstadoDeConta {
public Negativa(Conta conta) {
super(conta, "Negativa");
}
@Override
public EstadoDeConta deposita(double valor) {
conta.processaDeposito(valor * 0.95);
if(conta.getSaldo() < 0) {
return this;
}
return new Positiva(conta);
}
@Override
public EstadoDeConta saca(double valor) {
throw new RuntimeException("Conta negativa não pode efetuar saque");
}
}
public class Positiva extends EstadoDeConta {
public Positiva(Conta conta) {
super(conta, "Positiva");
}
@Override
public EstadoDeConta saca(double valor) {
conta.processaSaque(valor);
if( conta.getSaldo() > 0) {
return this;
}
return new Negativa(conta);
}
@Override
public EstadoDeConta deposita(double valor) {
conta.processaDeposito(valor * 0.98);
return this;
}
}
public abstract class EstadoDeConta {
protected Conta conta;
private String nomeEstado;
public EstadoDeConta(Conta conta, String nomeEstado) {
this.conta = conta;
this.nomeEstado = nomeEstado;
}
public abstract EstadoDeConta deposita(double valor);
public abstract EstadoDeConta saca(double valor);
public String getNomeEstado() {
return nomeEstado;
}
}
public class Conta {
// metodos com outras resposabilidades
protected void processaDeposito(double valor) {
saldo += valor;
}
protected void processaSaque(double valor) {
saldo -= valor;
}
}