O documento descreve o padrão de projeto Estado usando o exemplo de uma máquina de gomas. A máquina pode existir em diferentes estados internos (sem moeda, com moeda, vendido etc.) e muda seu comportamento de acordo com o estado, permitindo que pareça ter mudado de classe.
2. Padrão Estado Permite que um objeto altere o seu comportamento quando o seu estado interno muda. O objeto parecerá ter mudado de classe.
3. publicclassMaquinaDeGomas { final staticintSEM_GOMAS = 0; final staticintSEM_MOEDA = 1; final staticintCOM_MOEDA = 2; final staticintVENDIDO = 3; intstate = SEM_MOEDA; intquantidadeDeGomasNaMaquina = 0; publicMaquinaDeGomas(intquantidadeDeGomasNaMaquina) this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina; if (this.quantidadeDeGomasNaMaquina > 0) { state = SEM_MOEDA;
4. publicvoidinsereMoeda() if (state == COM_MOEDA) System.out.println("Voce não pode inserir outra moeda."); elseif (state == SEM_MOEDA) state = COM_MOEDA; System.out.println("Voce acabou de inserir uma moeda."); elseif (state == SEM_GOMAS) System.out.println("Voce não pode inserir uma moeda, porque a maquina esta sem goma."); elseif (state == VENDIDO) System.out.println("Aguarde, voce já receberá a sua goma."); publicvoidejetarMoeda() if (state == COM_MOEDA) System.out.println("Ejetando a moeda."); state = SEM_MOEDA; elseif (state == SEM_MOEDA) System.out.println("Voce não inseriu nenhuma moeda."); elseif (state == VENDIDO) System.out.println("Desculpe,mas voceja girou a menivela para retirar a goma."); elseif (state == SEM_GOMAS) System.out.println("Você não pode ejetar a moeda, porque a maquina está sem goma.");
5. publicvoidgirarManivelaDaMaquina() if (state == SEM_MOEDA) System.out.println("A maquina está sem moeda, não é possível girar a manivela." ); elseif (state == VENDIDO) System.out.println("Voce deve inserir uma moeda e em seguida girar a manivela"); elseif (state == SEM_GOMAS) System.out.println(“Desculpe, mas não há mais gomas na maquina."); elseif (state == COM_MOEDA) System.out.println("Voce acabou de girar a manivela."); state = SEM_MOEDA; entregarGoma();
6. privatevoidentregarGoma() if (state == VENDIDO) Sys..("A maquina esta providenciando a sua goma de mascar.") quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina - 1 if (quantidadeDeGomasNaMaquina == 0) Sys..("Retire sua goma de mascar."); state = SEM_GOMAS; else state = SEM_MOEDA; elseif (state == SEM_MOEDA) System.out.println("Voce precisa colocar a moeda primeiro."); elseif (state == SEM_GOMAS) System.out.println("As gomas acabaram."); elseif (state == COM_MOEDA) System.out.println("As gomas acabaram.");
8. ---------------------------- Maquina de Gomas Modelo 2011 Inventario: 5 Estado atual da maquina: Sem moeda inserida Voce acabou de inserir uma moeda. Voce acabou de girar a manivela. A maquina esta providenciando a sua goma de mascar. ---------------------------- Maquina de Gomas Modelo 2011 Inventario: 4 Estado atual da maquina: Sem moeda inserida Voce acabou de inserir uma moeda. Ejetando a moeda. A maquina está sem moeda, não é possível girar a manivela.
10. ---------------------------- Maquina de Gomas Modelo 2011 Inventario: 4 Estado atual da maquina: Sem moeda inserida Voce acabou de inserir uma moeda. Voce acabou de girar a manivela. A maquina esta providenciando a sua goma de mascar. Voce acabou de inserir uma moeda. Voce acabou de girar a manivela. A maquina esta providenciando a sua goma de mascar. Voce não inseriu nenhuma moeda.
11. ---------------------------- Maquina de Gomas Modelo 2011 Inventario: 2 Estado atual da maquina: Sem moeda inserida Voce acabou de inserir uma moeda. Voce não pode inserir outra moeda. Voce acabou de girar a manivela. A maquina esta providenciando a sua goma de mascar. Voce acabou de inserir uma moeda. Voce acabou de girar a manivela. A maquina esta providenciando a sua goma de mascar. Retire sua goma de mascar. Voce não pode inserir uma moeda, porque a maquina esta sem goma. Voce girou a manivela, mas não há mais gomas na maquina. ---------------------------- Maquina de Gomas Modelo 2011 Inventario: 0 Estado atual da maquina: Sem gomas de mascar
12. public interface Estado publicvoidinsereMoeda(); publicvoidejetarMoeda(); publicvoidgirarManivelaDaMaquina(); publicvoidentregarGoma();
13. publicclassMaquinaDeGomas { Estado semGomas; Estado semMoeda; Estado comMoeda; Estado vendido; Estado ganhador; Estado estado = semGomas; intquantidadeDeGomasNaMaquina = 0; publicMaquinaDeGomas(intquantidadeDeGomasNaMaquina) { this.semGomas = newEstadoSemGomas(this); this.semMoeda = newEstadoSemMoeda(this); this.comMoeda = newEstadoComMoeda(this); this.vendido = newEstadoVendido(this); this.ganhador = newEstadoGanhador(this); this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina; if (this.quantidadeDeGomasNaMaquina > 0) estado = semMoeda;
14. publicvoidinsereMoeda() this.estado.insereMoeda(); publicvoidejetarMoeda() this.estado.ejetarMoeda(); publicvoidgirarManivelaDaMaquina() this.estado.girarManivelaDaMaquina(); this.estado.entregarGoma(); publicvoidsetEstado(Estado state) this.estado = state; voidliberandoGoma() System.out.println("A maquina esta liberando a goma."); if (this.quantidadeDeGomasNaMaquina > 0) this.quantidadeDeGomasNaMaquina = this.quantidadeDeGomasNaMaquina - 1; /// Métodos de recuperação dos estados.
15. publicclassEstadoComMoedaimplements Estado Randomrandom = newRandom(System.currentTimeMillis()); MaquinaDeGomasmaquinaDeGomas; publicEstadoComMoeda(MaquinaDeGomasmaquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas; @Override publicvoidinsereMoeda() System.out.println("Vocenao pode inserir outra moeda."); @Override publicvoidejetarMoeda() System.out.println("Retornar moeda."); maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda());
16. @Override publicvoidgirarManivelaDaMaquina() { System.out.println("Voce girou a manivela..."); int ganhador = random.nextInt(10); if (ganhador == 0 && maquinaDeGomas.getQuantidadeDeGomasNaMaquina() > 1) maquinaDeGomas.setEstado( maquinaDeGomas.getGanhador()); else maquinaDeGomas.setEstado( maquinaDeGomas.getVendido()); @Override publicvoidentregarGoma() { System.out.println("Nao ha gomas na maquina.");
17. publicclassEstadoSemMoedaimplements Estado{ MaquinaDeGomasmaquinaDeGomas; publicEstadoSemMoeda(MaquinaDeGomasmaquinaDeGomas) { this.maquinaDeGomas = maquinaDeGomas; @Override publicvoidinsereMoeda() { maquinaDeGomas.setEstado(maquinaDeGomas.getComMoeda()); @Override publicvoidejetarMoeda() { System.out.println("Vocenao inseriu uma moeda."); @Override publicvoidgirarManivelaDaMaquina() { System.out.println("Vocenao pode girar a manivela porque nao inseriu nenhuma moeda."); @Override publicvoidentregarGoma() { System.out.println("Voce precisa inserir a moeda primeiro");
18. publicclassEstadoSemGomasimplements Estado { MaquinaDeGomasmaquinaDeGomas; publicEstadoSemGomas(MaquinaDeGomasmaquinaDeGomas) { this.maquinaDeGomas = maquinaDeGomas; @Override publicvoidinsereMoeda() { System.out.println("A maquina esta sem gomas."); @Override publicvoidejetarMoeda() { System.out.println("Voce ainda nao inseriu uma moeda."); @Override publicvoidgirarManivelaDaMaquina() { System.out.println("A maquina esta sem gomas."); @Override publicvoidentregarGoma() { System.out.println("A maquina esta sem gomas.");
19. publicclassEstadoVendidoimplements Estado { MaquinaDeGomasmaquinaDeGomas; publicEstadoVendido(MaquinaDeGomasmaquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas; publicvoidinsereMoeda() System.out.println("Aguarde, estamos pegando sua goma."); publicvoidejetarMoeda() System.out.println("Aguarde, Voce acabou de girar a manivela."); publicvoidgirarManivelaDaMaquina() System.out.println("Girar a manivela duas vezes nao adianta."); publicvoidentregarGoma() maquinaDeGomas.liberandoGoma(); if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() > 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda()); else System.out.println("Acabaram as gomas na maquina..."); maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas());
20. publicclassEstadoGanhadorimplements Estado { MaquinaDeGomasmaquinaDeGomas; publicEstadoGanhador(MaquinaDeGomasmaquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas; @Override publicvoidinsereMoeda() System.out.println("Nao é possivel inserir uma moeda."); @Override publicvoidejetarMoeda() System.out.println("Nao é possivel ejetar uma moeda."); @Override publicvoidgirarManivelaDaMaquina() System.out.println("Nao é possivel girar a manivela.");
21. @Override publicvoidentregarGoma() System.out.println("Voce é o ganhador...Parabens..."); if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() == 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas()); else maquinaDeGomas.liberandoGoma(); if (maquinaDeGomas.get QuantidadeDeGomasNaMaquina() > 0) maquinaDeGomas.setEstado( maquinaDeGomas.getSemMoeda()); else System.out.println("Acabaram as gomas..."); maquinaDeGomas.setEstado( maquinaDeGomas.getSemGomas());