Programação avançada – capitulo 8 – maquina de estados, exemplo2
Exemplo de uma maquina de estado, simples, usando as referências a um mecanismo de um elevador com dois estados extra: erro e chaveManutencao
Em que ficou:
Com:
package me_me_elevador; import me_me_elevador.IU.Texto.UsaElevador; import me_me_elevador.logica.Elevador; public class Me_ME_elevador { public static void main(String[] args) { Elevador e = new Elevador(); UsaElevador usaE = new UsaElevador(e); //interface com o utilizador usaE.corre(); } }
package me_me_elevador.IU.Texto; import me_me_elevador.logica.*; import me_me_elevador.util.IUUtil; public class UsaElevador { //o interface com o utilizador, com o nosso elevador. private Elevador elevador; private boolean sair = false; public UsaElevador(Elevador elevador) { this.elevador = elevador; } public void corre() { while (!sair) { //saber em que estado estou IEstado estado = elevador.getEstado(); if (estado instanceof RC) { iuRC(); } else if (estado instanceof Andar1) { iuAndar1(); } else if (estado instanceof Andar2) { iuAndar2(); } else if (estado instanceof Andar3) { iuAndar3(); }else if (estado instanceof Manutencao) { iuManutencao(); } } } private void iuManutencao() { int opcao = IUUtil.getOpcao("Em modo de manutenção", "Usar a chave", "Sair do elevador"); switch (opcao) { case 0: elevador.chaveManutencao(); case 1: sair = true; break; } } private void iuRC() { //opcoa 1 //pedir ao utilizador: sair ou subir int opcao = IUUtil.getOpcao("Piso R/C", "Sair do prédio", "Subir", "Erro"); switch (opcao) { case 0: sair = true; break; case 1: //fazer evoluir a maquina de estados elevador.sobe(); break; case 2: elevador.erro(); break; } } private void iuAndar1() { int opcao = IUUtil.getOpcao("Piso 1 andar", "Descer", "Subir", "Erro"); switch (opcao) { case 0: //fazer evoluir a maquina de estados elevador.desce(); break; case 1: //fazer evoluir a maquina de estados elevador.sobe(); break; case 2: elevador.erro(); break; } } private void iuAndar2() { int opcao = IUUtil.getOpcao("Piso 2 andar", "Descer", "Subir", "Erro"); switch (opcao) { case 0: //fazer evoluir a maquina de estados elevador.desce(); break; case 1: //fazer evoluir a maquina de estados elevador.sobe(); break; case 2: elevador.erro(); break; } } private void iuAndar3() { int opcao = IUUtil.getOpcao("Piso 3 andar", "Descer", "Erro"); switch (opcao) { case 0: //fazer evoluir a maquina de estados elevador.desce(); break; case 1: elevador.erro(); break; } } }
package me_me_elevador.logica; public class Andar1 extends Piso { @Override public IEstado sobe() { //altero de estado return new Andar2(); } @Override public IEstado desce() { //altero de estado return new RC(); } //se fossem todos iguais podia ser implementado no Piso // com return this; @Override public IEstado erro() { return new Manutencao(this); } }
package me_me_elevador.logica; public class Andar2 extends Piso{ @Override public IEstado sobe() { return new Andar3(); } @Override public IEstado desce() { return new Andar1(); } @Override public IEstado erro() { return new Manutencao(this); } }
package me_me_elevador.logica; public class Andar3 extends Piso{ @Override public IEstado sobe() { //fico no mesmo estado return this; } @Override public IEstado desce() { //altero de estado return new Andar2(); } @Override public IEstado erro() { return new Manutencao(this); } }
package me_me_elevador.logica; public class Elevador { IEstado estado; public Elevador() { estado = new RC(); } public IEstado getEstado() { return estado; } public void setEstado(IEstado estado) { this.estado = estado; } public void sobe() { setEstado(estado.sobe()); } public void desce() { setEstado(estado.desce()); } public void erro(){ setEstado(estado.erro()); } public void chaveManutencao(){ setEstado(estado.chaveManutencao()); } }
package me_me_elevador.logica; public interface IEstado { IEstado sobe(); IEstado desce(); IEstado erro(); IEstado chaveManutencao(); }
package me_me_elevador.logica; public class Manutencao extends Piso{ //vai recordar qual era o estado antes private IEstado anterior; public Manutencao(IEstado ant) { this.anterior = ant; } @Override public IEstado chaveManutencao() { return anterior; } }
package me_me_elevador.logica; public abstract class Piso implements IEstado { @Override public IEstado sobe() { return this; } @Override public IEstado desce() { return this; } @Override public IEstado chaveManutencao() { return this; } @Override public IEstado erro() { return this; } }
package me_me_elevador.logica; public class RC extends Piso { @Override public IEstado sobe() { //altero de estado return new Andar1(); } @Override public IEstado desce() { //fico no mesmo estado return this; } @Override public IEstado erro() { return new Manutencao(this); } }
package me_me_elevador.util; import java.util.Scanner; public class IUUtil { public static int getOpcao(String question, String... options) { System.out.println(question); char[] ops = new char[options.length]; for (int i = 0; i < options.length; i++) { char o = '\0'; int c = 0; while (c < options[i].length()) { o = Character.toUpperCase(options[i].charAt(c)); for (int j = 0; j < i; j++) { if (ops[j] == o) { o = '\0'; break; } } if (o != '\0') { break; } c++; } if (c >= options[i].length()) { return -1; } ops[i] = o; if (i > 0) { System.out.print(", "); } if (c > 0) { System.out.print(options[i].substring(0, c)); } System.out.print("(" + ops[i] + ")" + options[i].substring(c + 1)); } System.out.println(); Scanner sc = new Scanner(System.in); while (true) { System.out.print("Option: "); char o = Character.toUpperCase(sc.nextLine().charAt(0)); for (int i = 0; i < ops.length; i++) { if (o == ops[i]) { return i; } } } } }
O erro e a chaveEmergencia são acções, sendo que o evento que surge é a Manutenção.
Tags : java, Máquina de estados, Programação avançada
0 thoughts on “Programação avançada – capitulo 8 – maquina de estados, exemplo2”