Padrão Estado

Download Padrão Estado

Post on 21-Jul-2015

532 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

Slide 1

Design PatternsPadro EstadoPermite 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 no 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 no 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 no 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 no 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, no possvel 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 no 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: 5Estado 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: 4Estado atual da maquina: Sem moeda inserida

Voce acabou de inserir uma moeda.Ejetando a moeda.A maquina est sem moeda, no possvel 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: 4Estado 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 no inseriu nenhuma moeda.

----------------------------Maquina de Gomas Modelo 2011 Inventario: 2Estado atual da maquina: Sem moeda inserida

Voce acabou de inserir uma moeda.Voce no 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 no pode inserir uma moeda, porque a maquina esta sem goma.Voce girou a manivela, mas no h mais gomas na maquina.

----------------------------Maquina de Gomas Modelo 2011 Inventario: 0Estado 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;/// Mtodos de recuperao dos estados.public class EstadoComMoeda implements Estado

Random random = new Random(System.currentTimeMillis());MaquinaDeGomas maquinaDeGomas;

public EstadoComMoeda(MaquinaDeGomas maquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas;

@Overridepublic void insereMoeda() System.out.println("Voce nao pode inserir outra moeda.");

@Overridepublic void ejetarMoeda() System.out.println("Retornar moeda.");maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda());@Overridepublic void girarManivelaDaMaquina() {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());

@Overridepublic void entregarGoma() {System.out.println("Nao ha gomas na maquina.");

public class EstadoSemMoeda implements Estado{

MaquinaDeGomas maquinaDeGomas;

public EstadoSemMoeda(MaquinaDeGomas maquinaDeGomas) {this.maquinaDeGomas = maquinaDeGomas;

@Overridepublic void insereMoeda() {maquinaDeGomas.setEstado(maquinaDeGomas.getComMoeda());

@Overridepublic void ejetarMoeda() {System.out.println("Voce nao inseriu uma moeda.");

@Overridepublic void girarManivelaDaMaquina() {System.out.println("Voce nao pode girar a manivela porque nao inseriu nenhuma moeda.");

@Overridepublic 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;

@Overridepublic void insereMoeda() {System.out.println("A maquina esta sem gomas.");

@Overridepublic void ejetarMoeda() {System.out.println("Voce ainda nao inseriu uma moeda.");

@Overridepublic void girarManivelaDaMaquina() {System.out.println("A maquina esta sem gomas.");

@Overridepublic 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;

@Overridepublic void insereMoeda() System.out.println("Nao possivel inserir uma moeda.");

@Overridepublic void ejetarMoeda() System.out.println("Nao possivel ejetar uma moeda.");

@Overridepublic void girarManivelaDaMaquina() System.out.println("Nao possivel girar a manivela.");@Overridepublic void entregarGoma()

System.out.println("Voce o ganhador...Parabens...");

if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() == 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas()); else maquinaDeGomas.liberandoGoma();if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() > 0) maquinaDeGomas.setEstado(maquinaDeGomas.getS