Padrão Estado

Download Padrão Estado

Post on 21-Jul-2015

532 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<p>Slide 1</p> <p>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 {</p> <p>final static int SEM_GOMAS = 0;final static int SEM_MOEDA = 1;final static int COM_MOEDA = 2;final static int VENDIDO = 3;</p> <p>int state = SEM_MOEDA;int quantidadeDeGomasNaMaquina = 0;</p> <p>public MaquinaDeGomas(int quantidadeDeGomasNaMaquina) this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina;</p> <p>if (this.quantidadeDeGomasNaMaquina &gt; 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.");</p> <p>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();</p> <p>private void entregarGoma() if (state == VENDIDO) Sys..("A maquina esta providenciando a sua goma de mascar.")quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina - 1</p> <p>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.");</p> <p>public class MaquinaDeGomasTestDrive {</p> <p>public static void main(String[] args) {</p> <p> MaquinaDeGomas maquinaDeGomas = new MaquinaDeGomas(5);</p> <p>System.out.println(maquinaDeGomas);</p> <p>maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();</p> <p>System.out.println(maquinaDeGomas);</p> <p>maquinaDeGomas.insereMoeda();maquinaDeGomas.ejetarMoeda();maquinaDeGomas.girarManivelaDaMaquina();</p> <p>System.out.println(maquinaDeGomas);----------------------------Maquina de Gomas Modelo 2011 Inventario: 5Estado atual da maquina: Sem moeda inserida</p> <p>Voce acabou de inserir uma moeda.Voce acabou de girar a manivela.A maquina esta providenciando a sua goma de mascar.</p> <p>----------------------------Maquina de Gomas Modelo 2011 Inventario: 4Estado atual da maquina: Sem moeda inserida</p> <p>Voce acabou de inserir uma moeda.Ejetando a moeda.A maquina est sem moeda, no possvel girar a manivela.</p> <p>maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();maquinaDeGomas.ejetarMoeda();</p> <p>System.out.println(maquinaDeGomas);</p> <p>maquinaDeGomas.insereMoeda();maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();maquinaDeGomas.insereMoeda();maquinaDeGomas.girarManivelaDaMaquina();</p> <p>System.out.println(maquinaDeGomas);----------------------------Maquina de Gomas Modelo 2011 Inventario: 4Estado atual da maquina: Sem moeda inserida</p> <p>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.</p> <p>----------------------------Maquina de Gomas Modelo 2011 Inventario: 2Estado atual da maquina: Sem moeda inserida</p> <p>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.</p> <p>----------------------------Maquina de Gomas Modelo 2011 Inventario: 0Estado atual da maquina: Sem gomas de mascar</p> <p>public interface Estado </p> <p>public void insereMoeda();</p> <p>public void ejetarMoeda();</p> <p>public void girarManivelaDaMaquina();</p> <p>public void entregarGoma();public class MaquinaDeGomas {Estado semGomas;Estado semMoeda;Estado comMoeda;Estado vendido;Estado ganhador;Estado estado = semGomas;int quantidadeDeGomasNaMaquina = 0;</p> <p>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);</p> <p>this.quantidadeDeGomasNaMaquina = quantidadeDeGomasNaMaquina;if (this.quantidadeDeGomasNaMaquina &gt; 0) estado = semMoeda;public void insereMoeda() this.estado.insereMoeda();</p> <p>public void ejetarMoeda() this.estado.ejetarMoeda();</p> <p>public void girarManivelaDaMaquina() this.estado.girarManivelaDaMaquina();this.estado.entregarGoma();</p> <p>public void setEstado(Estado state) this.estado = state;</p> <p>void liberandoGoma() System.out.println("A maquina esta liberando a goma.");</p> <p>if (this.quantidadeDeGomasNaMaquina &gt; 0) this.quantidadeDeGomasNaMaquina = this.quantidadeDeGomasNaMaquina - 1;/// Mtodos de recuperao dos estados.public class EstadoComMoeda implements Estado </p> <p>Random random = new Random(System.currentTimeMillis());MaquinaDeGomas maquinaDeGomas;</p> <p>public EstadoComMoeda(MaquinaDeGomas maquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas; </p> <p>@Overridepublic void insereMoeda() System.out.println("Voce nao pode inserir outra moeda.");</p> <p>@Overridepublic void ejetarMoeda() System.out.println("Retornar moeda.");maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda());@Overridepublic void girarManivelaDaMaquina() {System.out.println("Voce girou a manivela...");</p> <p>int ganhador = random.nextInt(10);if (ganhador == 0 &amp;&amp; maquinaDeGomas.getQuantidadeDeGomasNaMaquina() &gt; 1) maquinaDeGomas.setEstado(maquinaDeGomas.getGanhador()); else maquinaDeGomas.setEstado(maquinaDeGomas.getVendido());</p> <p>@Overridepublic void entregarGoma() {System.out.println("Nao ha gomas na maquina.");</p> <p>public class EstadoSemMoeda implements Estado{</p> <p>MaquinaDeGomas maquinaDeGomas;</p> <p>public EstadoSemMoeda(MaquinaDeGomas maquinaDeGomas) {this.maquinaDeGomas = maquinaDeGomas; </p> <p>@Overridepublic void insereMoeda() {maquinaDeGomas.setEstado(maquinaDeGomas.getComMoeda());</p> <p>@Overridepublic void ejetarMoeda() {System.out.println("Voce nao inseriu uma moeda.");</p> <p>@Overridepublic void girarManivelaDaMaquina() {System.out.println("Voce nao pode girar a manivela porque nao inseriu nenhuma moeda.");</p> <p>@Overridepublic void entregarGoma() {System.out.println("Voce precisa inserir a moeda primeiro");public class EstadoSemGomas implements Estado {</p> <p>MaquinaDeGomas maquinaDeGomas;</p> <p>public EstadoSemGomas(MaquinaDeGomas maquinaDeGomas) {this.maquinaDeGomas = maquinaDeGomas; </p> <p>@Overridepublic void insereMoeda() {System.out.println("A maquina esta sem gomas.");</p> <p>@Overridepublic void ejetarMoeda() {System.out.println("Voce ainda nao inseriu uma moeda.");</p> <p>@Overridepublic void girarManivelaDaMaquina() {System.out.println("A maquina esta sem gomas.");</p> <p>@Overridepublic void entregarGoma() {System.out.println("A maquina esta sem gomas.");</p> <p>public class EstadoVendido implements Estado {MaquinaDeGomas maquinaDeGomas;</p> <p>public EstadoVendido(MaquinaDeGomas maquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas; </p> <p>public void insereMoeda() System.out.println("Aguarde, estamos pegando sua goma.");</p> <p>public void ejetarMoeda() System.out.println("Aguarde, Voce acabou de girar a manivela.");</p> <p>public void girarManivelaDaMaquina() System.out.println("Girar a manivela duas vezes nao adianta.");</p> <p>public void entregarGoma() maquinaDeGomas.liberandoGoma();</p> <p>if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() &gt; 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda()); else System.out.println("Acabaram as gomas na maquina...");maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas());public class EstadoGanhador implements Estado {</p> <p>MaquinaDeGomas maquinaDeGomas;</p> <p>public EstadoGanhador(MaquinaDeGomas maquinaDeGomas) this.maquinaDeGomas = maquinaDeGomas;</p> <p>@Overridepublic void insereMoeda() System.out.println("Nao possivel inserir uma moeda.");</p> <p>@Overridepublic void ejetarMoeda() System.out.println("Nao possivel ejetar uma moeda.");</p> <p>@Overridepublic void girarManivelaDaMaquina() System.out.println("Nao possivel girar a manivela.");@Overridepublic void entregarGoma() </p> <p>System.out.println("Voce o ganhador...Parabens...");</p> <p>if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() == 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas()); else maquinaDeGomas.liberandoGoma();if (maquinaDeGomas.getQuantidadeDeGomasNaMaquina() &gt; 0) maquinaDeGomas.setEstado(maquinaDeGomas.getSemMoeda()); else System.out.println("Acabaram as gomas...");maquinaDeGomas.setEstado(maquinaDeGomas.getSemGomas()); Obrigado !</p>