Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Olá. Fiz esse código exemplo para o padrão STATE. Está ok ??

    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();

        }
    }
1 resposta

Olá, Maurício!

Rodei na minha máquina e aparentemente está OK!

Favor inserir o PIN primeiro.
Cartao ejetado.
Favor inserir o PIN primeiro.
PIN correto.
2000 e fornecido na maquina.
Cartao ejetado.
Nos nao temos dinheiro.
Nos nao temos dinheiro.

Você fez esse projeto? Está muito bom!

É claro que não tive tempo de fazer uma bateria de testes, como seria na vida real, mas acho que você poderia mudar a classe ATMSemDinheiro para não exibir a mensagem "sem dinheiro" o tempo todo, mas apenas quando o usuário solicita uma retirada sem cédulas na máquina. Afinal de contas, um cliente pode inserir o cartão só pra consultar seu saldo ;-)

Fora isso, está no caminho certo! Um abraço!

    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.");
        }
    }

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software