Post on 21-Jul-2015
Padrão Estado
Permite que um objeto altere o seu comportamento quando o seu estado interno muda. O objeto parecerá ter mudado de classe.
public class MaquinaDeGomas {
final static int SEM_GOMAS = 0;
final static int SEM_MOEDA = 1;
final static int COM_MOEDA = 2;
final static int VENDIDO = 3;
int state = SEM_MOEDA;
int quantidadeDeGomasNaMaquina = 0;
public MaquinaDeGomas(int quantidadeDeGomasNaMaquina)
this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina;
if (this.quantidadeDeGomasNaMaquina > 0) {
state = SEM_MOEDA;
public void insereMoeda()
if (state == COM_MOEDA)
System.out.println("Voce não pode inserir outra moeda.");
else if (state == SEM_MOEDA)
state = COM_MOEDA;
System.out.println("Voce acabou de inserir uma moeda.");
else if (state == SEM_GOMAS)
System.out.println("Voce não pode inserir uma moeda, porque a maquina esta sem goma.");
else if (state == VENDIDO)
System.out.println("Aguarde, voce já receberá a sua goma.");
public void ejetarMoeda()
if (state == COM_MOEDA)
System.out.println("Ejetando a moeda.");
state = SEM_MOEDA;
else if (state == SEM_MOEDA)
System.out.println("Voce não inseriu nenhuma moeda.");
else if (state == VENDIDO)
System.out.println("Desculpe,mas voce ja girou a menivela para retirar a goma.");
else if (state == SEM_GOMAS)
System.out.println("Você não pode ejetar a moeda, porque a maquina está sem goma.");
public void girarManivelaDaMaquina()
if (state == SEM_MOEDA)
System.out.println("A maquina está sem moeda, não é possível girar a manivela." );
else if (state == VENDIDO)
System.out.println("Voce deve inserir uma moeda e em seguida girar a manivela");
else if (state == SEM_GOMAS)
System.out.println(“Desculpe, mas não há mais gomas na maquina.");
else if (state == COM_MOEDA)
System.out.println("Voce acabou de girar a manivela.");
state = SEM_MOEDA;
entregarGoma();
private void entregarGoma()
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;
else if (state == SEM_MOEDA)
System.out.println("Voce precisa colocar a moeda primeiro.");
else if (state == SEM_GOMAS)
System.out.println("As gomas acabaram.");
else if (state == COM_MOEDA)
System.out.println("As gomas acabaram.");
public class MaquinaDeGomasTestDrive {
public static void main(String[] args) {
MaquinaDeGomas maquinaDeGomas = new MaquinaDeGomas(5);
System.out.println(maquinaDeGomas);
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
System.out.println(maquinaDeGomas);
maquinaDeGomas.insereMoeda();
maquinaDeGomas.ejetarMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
System.out.println(maquinaDeGomas);
----------------------------
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.
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
maquinaDeGomas.ejetarMoeda();
System.out.println(maquinaDeGomas);
maquinaDeGomas.insereMoeda();
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
maquinaDeGomas.insereMoeda();
maquinaDeGomas.girarManivelaDaMaquina();
System.out.println(maquinaDeGomas);
----------------------------
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.
----------------------------
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
public interface Estado
public void insereMoeda();
public void ejetarMoeda();
public void girarManivelaDaMaquina();
public void entregarGoma();
public class MaquinaDeGomas {
Estado semGomas;
Estado semMoeda;
Estado comMoeda;
Estado vendido;
Estado ganhador;
Estado estado = semGomas;
int quantidadeDeGomasNaMaquina = 0;
public MaquinaDeGomas(int quantidadeDeGomasNaMaquina) {
this.semGomas = new EstadoSemGomas(this);
this.semMoeda = new EstadoSemMoeda(this);
this.comMoeda = new EstadoComMoeda(this);
this.vendido = new EstadoVendido(this);
this.ganhador = new EstadoGanhador(this);
this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina;
if (this.quantidadeDeGomasNaMaquina > 0)
estado = semMoeda;
public void insereMoeda()
this.estado.insereMoeda();
public void ejetarMoeda()
this.estado.ejetarMoeda();
public void girarManivelaDaMaquina()
this.estado.girarManivelaDaMaquina();
this.estado.entregarGoma();
public void setEstado(Estado state)
this.estado = state;
void liberandoGoma()
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.
public class EstadoComMoeda implements Estado
Random random = new Random(System.currentTimeMillis());
MaquinaDeGomas maquinaDeGomas;
public EstadoComMoeda(MaquinaDeGomas maquinaDeGomas)
this.maquinaDeGomas = maquinaDeGomas;
@Override
public void insereMoeda()
System.out.println("Voce nao pode inserir outra moeda.");
@Override
public void ejetarMoeda()
System.out.println("Retornar moeda.");
maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda());
@Override
public void girarManivelaDaMaquina() {
System.out.println("Voce girou a manivela...");
int ganhador = random.nextInt(10);
if (ganhador == 0 && maquinaDeGomas.getQuantidadeDeGomasNaMaqu
ina() > 1)
maquinaDeGomas.setEstado(
maquinaDeGomas.getGanhador());
else
maquinaDeGomas.setEstado(
maquinaDeGomas.getVendido());
@Override
public void entregarGoma() {
System.out.println("Nao ha gomas na maquina.");
public class EstadoSemMoeda implements Estado{
MaquinaDeGomas maquinaDeGomas;
public EstadoSemMoeda(MaquinaDeGomas maquinaDeGomas) {
this.maquinaDeGomas = maquinaDeGomas;
@Override
public void insereMoeda() {
maquinaDeGomas.setEstado(maquinaDeGomas.getComMoeda());
@Override
public void ejetarMoeda() {
System.out.println("Voce nao inseriu uma moeda.");
@Override
public void girarManivelaDaMaquina() {
System.out.println("Voce nao pode girar a manivela porque nao inseriu nenhuma moeda.");
@Override
public void entregarGoma() {
System.out.println("Voce precisa inserir a moeda primeiro");
public class EstadoSemGomas implements Estado {
MaquinaDeGomas maquinaDeGomas;
public EstadoSemGomas(MaquinaDeGomas maquinaDeGomas) {
this.maquinaDeGomas = maquinaDeGomas;
@Override
public void insereMoeda() {
System.out.println("A maquina esta sem gomas.");
@Override
public void ejetarMoeda() {
System.out.println("Voce ainda nao inseriu uma moeda.");
@Override
public void girarManivelaDaMaquina() {
System.out.println("A maquina esta sem gomas.");
@Override
public void entregarGoma() {
System.out.println("A maquina esta sem gomas.");
public class EstadoVendido implements Estado {
MaquinaDeGomas maquinaDeGomas;
public EstadoVendido(MaquinaDeGomas maquinaDeGomas)
this.maquinaDeGomas = maquinaDeGomas;
public void insereMoeda()
System.out.println("Aguarde, estamos pegando sua goma.");
public void ejetarMoeda()
System.out.println("Aguarde, Voce acabou de girar a manivela.");
public void girarManivelaDaMaquina()
System.out.println("Girar a manivela duas vezes nao adianta.");
public void entregarGoma()
maquinaDeGomas.liberandoGoma();
if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() > 0)
maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda());
else
System.out.println("Acabaram as gomas na maquina...");
maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas());
public class EstadoGanhador implements Estado {
MaquinaDeGomas maquinaDeGomas;
public EstadoGanhador(MaquinaDeGomas maquinaDeGomas)
this.maquinaDeGomas = maquinaDeGomas;
@Override
public void insereMoeda()
System.out.println("Nao é possivel inserir uma moeda.");
@Override
public void ejetarMoeda()
System.out.println("Nao é possivel ejetar uma moeda.");
@Override
public void girarManivelaDaMaquina()
System.out.println("Nao é possivel girar a manivela.");
@Override
public void entregarGoma()
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());