public interface IATMState
{
void InserirCartao();
void EjetarCartao();
void InserirPIN(int enterPIN);
void SolicitarDinheiro(int dinheiro);
}
public class ATMMachine
{
IATMState PossuiCartao;
IATMState SemCartao;
IATMState PossuiPINCorreto;
IATMState ATMSemDinheiro;
IATMState ATMState;
public int dinheiroNaMaquina = 2000;
public bool pinCorretoInserido = false;
public ATMMachine()
{
PossuiCartao = new PossuiCartao(this);
SemCartao = new SemCartao(this);
PossuiPINCorreto = new PossuiPINCorreto(this);
ATMSemDinheiro = new ATMSemDinheiro(this);
ATMState = SemCartao;
if (dinheiroNaMaquina < 0)
{
ATMState = ATMSemDinheiro;
}
}
public void SetATMState(IATMState newATMState)
{
ATMState = newATMState;
}
public void SetDinheiroNaMaquina(int newDinheiroNaMaquina)
{
dinheiroNaMaquina = newDinheiroNaMaquina;
}
public void EjetarCartao()
{
ATMState.EjetarCartao();
}
public void InserirCartao()
{
ATMState.InserirCartao();
}
public void InserirPIN(int enterPIN)
{
ATMState.InserirPIN(enterPIN);
}
public void SolicitarDinheiro(int dinheiro)
{
ATMState.SolicitarDinheiro(dinheiro);
}
public IATMState GetPossuiState() { return PossuiCartao; }
public IATMState GetNaoPossuiState() { return SemCartao; }
public IATMState GetPossuiPIN() { return PossuiPINCorreto; }
public IATMState GetNaoPossuiDinheiroState() { return ATMSemDinheiro; }
}
internal class PossuiCartao : IATMState
{
private ATMMachine aTMMachine;
public PossuiCartao(ATMMachine aTMMachine)
{
this.aTMMachine = aTMMachine;
}
public void EjetarCartao()
{
Console.WriteLine("Cartao ejetado.");
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiState());
}
public void InserirCartao()
{
Console.WriteLine("Voce nao pode inserir mais de um cartao.");
}
public void InserirPIN(int enterPIN)
{
if (enterPIN == 1234)
{
Console.WriteLine("PIN correto.");
aTMMachine.pinCorretoInserido = true;
aTMMachine.SetATMState(aTMMachine.GetPossuiPIN());
}
else
{
Console.WriteLine("PIN errado.");
aTMMachine.pinCorretoInserido = false;
Console.WriteLine("Cartao ejetado.");
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiState());
}
}
public void SolicitarDinheiro(int dinheiro)
{
Console.WriteLine("Favor inserir o PIN primeiro.");
}
}
internal class SemCartao : IATMState
{
private ATMMachine aTMMachine;
public SemCartao(ATMMachine aTMMachine)
{
this.aTMMachine = aTMMachine;
}
public void EjetarCartao()
{
Console.WriteLine("Favor inserir o cartao primeiro.");
}
public void InserirCartao()
{
Console.WriteLine("Favor inserir o PIN primeiro.");
aTMMachine.SetATMState(aTMMachine.GetPossuiState());
}
public void InserirPIN(int enterPIN)
{
Console.WriteLine("Favor inserir o cartao primeiro.");
}
public void SolicitarDinheiro(int dinheiro)
{
Console.WriteLine("Favor inserir o cartao primeiro.");
}
}
internal class PossuiPINCorreto : IATMState
{
private ATMMachine aTMMachine;
public PossuiPINCorreto(ATMMachine aTMMachine)
{
this.aTMMachine = aTMMachine;
}
public void EjetarCartao()
{
Console.WriteLine("Cartao ejetado.");
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiState());
}
public void InserirCartao()
{
Console.WriteLine("Voce nao pode inserir mais de um cartao.");
}
public void InserirPIN(int enterPIN)
{
Console.WriteLine("PIN já inserido.");
}
public void SolicitarDinheiro(int dinheiro)
{
if (dinheiro > aTMMachine.dinheiroNaMaquina)
{
Console.WriteLine("Nao possui dinheiro.");
Console.WriteLine("Cartao ejetado.");
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiState());
}
else
{
Console.WriteLine(dinheiro + " e fornecido na maquina.");
aTMMachine.SetDinheiroNaMaquina(aTMMachine.dinheiroNaMaquina - dinheiro);
Console.WriteLine("Cartao ejetado.");
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiState());
if (aTMMachine.dinheiroNaMaquina <= 0)
{
aTMMachine.SetATMState(aTMMachine.GetNaoPossuiDinheiroState());
}
}
}
}
internal class ATMSemDinheiro : IATMState
{
private ATMMachine aTMMachine;
public ATMSemDinheiro(ATMMachine aTMMachine)
{
this.aTMMachine = aTMMachine;
}
public void EjetarCartao()
{
Console.WriteLine("Nos nao temos dinheiro. Voce nao pode inserir o cartao");
}
public void InserirCartao()
{
Console.WriteLine("Nos nao temos dinheiro.");
}
public void InserirPIN(int enterPIN)
{
Console.WriteLine("Nos nao temos dinheiro.");
}
public void SolicitarDinheiro(int dinheiro)
{
Console.WriteLine("Nos nao temos dinheiro.");
}
}
class Program
{
static void Main(string[] args)
{
ATMMachine atmMachine = new ATMMachine();
atmMachine.InserirCartao();
atmMachine.EjetarCartao();
atmMachine.InserirCartao();
atmMachine.InserirPIN(1234);
atmMachine.SolicitarDinheiro(2000);
atmMachine.InserirCartao();
atmMachine.InserirPIN(1234);
Console.ReadKey();
}
}