22
Design Patterns

Padrão Estado

Embed Size (px)

Citation preview

Design Patterns

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

Obrigado !