Buscar

Trabalho de Analise e Projeto de Software

Prévia do material em texto

Trabalho de Análise e Projeto de 
Software 
Alunos: Jeanne Pereira 
 Hundson Bandeira 
 
Professor: Rodrigo Quites 
1º) Implementar o statechart abaixo com uso de pattem State. 
2º) Construa uma façade com, no mínimo, 3 serviços, que encapsulem funcionalidades que 
estão dispersas em, no mínimo, 4 classes. Esta façade deve ser singleton. 
 
Diagrama de classes 
Diagrama de classes 
Diagrama de classes 
package questao_2; 
 
import java.util.Date; 
 
public class Procedimento { 
 private Date dataHora; 
 
 public Procedimento(Date dataHora) { 
 this.dataHora = dataHora; 
 } 
 
 public void setDataHora(Date dataHora) { 
 this.dataHora = dataHora; 
 } 
 
Implementação 
continua -> 
 public Date getDataHora() { 
 return dataHora; 
 } 
 
 @Override 
 public String toString() { 
 return "Data e hora: "+dataHora.toString()+"\t"; 
 } 
 
} 
Implementação 
package questao_2; 
import java.util.Date; 
public class Consulta extends Procedimento { 
 private String especialidade; 
 
 Consulta(Date dataHora,int especialidade) { 
 super(dataHora); 
 switch(especialidade) { 
 case 1: 
 this.especialidade = "Clinico Geral"; 
 break; 
 case 2: 
 this.especialidade = "Cardiologia"; 
 break; 
 case 3: 
 this.especialidade = "Dermatologia"; 
 break; 
 default: 
 System.out.println("Tipo invalido"); 
 } 
 } 
 
 
Implementação 
continua -> 
public static void verificaDataHoraDisponivel(int especialidade) { 
 if(especialidade == 1) { 
 System.out.println("Clinico Geral"); 
 System.out.println("A partir do dia 28/03/2016 das 8:00 às 12:00hs e das 
14:00hs as 18:00hs"); 
 System.out.println("Todos os dias"); 
 } 
 else if(especialidade == 2) { 
 System.out.println("Cardiologia"); 
 System.out.println("A partir do dia 29/03/2016 das 14:00hs as 18:00hs"); 
 System.out.println("Dias de Terça, Quinta, Sexta"); 
 } 
 else if(especialidade == 3) { 
 System.out.println("Dermatologia"); 
 System.out.println("A partir do dia 29/03/2016 das 8:00hs as 12:00hs"); 
 System.out.println("Dias de Terça, Quinta"); 
 } 
 } 
 @Override 
 public String toString() { 
 return "Consulta: "+this.especialidade; 
 } 
 
 
} 
 
Implementação 
package questao_2; 
import java.util.Date; 
 public class Exame extends Procedimento{ 
 private String resultado; 
 private String tipoExame; 
 
 Exame(Date dataHora, int tipoExame) { 
 super(dataHora); 
 switch(tipoExame) { 
 case 1: 
 this.tipoExame = "Sangue"; 
 break; 
 case 2: 
 this.tipoExame = "Fezes"; 
 break; 
 case 3: 
 this.tipoExame = "Urina"; 
 break; 
 default: 
 System.out.println("Tipo invalido"); 
 } 
 } 
 
 
 
Implementação 
continua -> 
Implementação 
 public static void verificaDataHoraDisponivel(int tipoExame) { 
 System.out.println("De segunda a sexta das 8:00 às 18:00hs"); 
 } 
 
 public void verResultado() { 
 resultado = "XXXXXXXXXX"; 
 System.out.println(resultado); 
 } 
 
 @Override 
 public String toString() { 
 return super.toString()+"Tipo de exame "+tipoExame; 
 } 
 
} 
package questao_2; 
 
import java.util.ArrayList; 
public class SocioPlano { 
 private String nome; 
 private int socioId; 
 private int cotaMaximaConsulta = 10; 
 private int cotaConsulta; 
 private int cotaMaximaExame = 10; 
 private int cotaExame; 
 private ArrayList<Procedimento> procedimentos; 
 
 public SocioPlano(String nome, int socioId) { 
 this.nome = nome; 
 this.socioId = socioId; 
 this.procedimentos = new ArrayList(); 
 } 
 
 public ArrayList<Procedimento> getProcedimentos() { 
 return procedimentos; 
 } 
 
 
Implementação 
continua -> 
public boolean atingiuCotaMaximaConsulta() { 
 cotaConsulta = 0; 
 for(Procedimento proc: procedimentos) 
 if(proc instanceof Consulta) 
 cotaConsulta++; 
 return (cotaConsulta >= cotaMaximaConsulta); 
 } 
 
 public boolean atingiuCotaMaximaExame() { 
 cotaExame = 0; 
 for(Procedimento proc: procedimentos) 
 if(proc instanceof Exame) 
 cotaExame++; 
 return (cotaExame >= cotaMaximaExame); 
 } 
 
 
Implementação 
continua -> 
public void verResultadoExame() { 
 // Escolhe um exame para mostrar o resultado 
 for(int i = 0; i < procedimentos.size(); i++) { 
 if(procedimentos.get(i) instanceof Exame) { 
 Exame temp = (Exame) procedimentos.get(i); 
 temp.verResultado(); 
 break; 
 } 
 } 
 } 
 
 public void listarConsultas() { 
 int i; 
 for(i = 0; i < procedimentos.size(); i++) { 
 if(this.procedimentos.get(i) instanceof Consulta) { 
 System.out.println("Consulta"); 
 System.out.println(i+" - "+this.procedimentos.get(i)); 
 } 
 } 
 } 
 
 
 
Implementação 
continua -> 
 public void listarExames() { 
 int i; 
 for(i = 0; i < procedimentos.size(); i++) { 
 if(this.procedimentos.get(i) instanceof Exame) { 
 System.out.println("Exame"); 
 System.out.println(i+" - "+this.procedimentos.get(i)); 
 } 
 } 
 } 
} 
 
 
Implementação 
package questao_2; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.Scanner; 
 
public class ProcedimentoFacadeSingleton { 
 private static boolean instance_flag = false; 
 private SocioPlano socioPlano; 
 private Procedimento procedimento; 
 
 private void ProcedimentoFacadeSingleton() {} 
 
 public static ProcedimentoFacadeSingleton instance() { 
 if( !instance_flag) { 
 instance_flag = true; 
 return new ProcedimentoFacadeSingleton(); 
 } 
 return null; 
 } 
 
 
Implementação 
continua -> 
@Override 
 public void finalize() { 
 instance_flag = false; 
 } 
 
 public void inicializarSocio() { 
 Scanner entrada = new Scanner(System.in); 
 System.out.println("Nome do socio"); 
 String nome = entrada.nextLine(); 
 System.out.println("Id do Socio"); 
 int id = entrada.nextInt(); 
 socioPlano = new SocioPlano(nome,id); 
 } 
 
 
 
 
 
Implementação 
continua -> 
public void menu() { 
 Scanner entrada = new Scanner(System.in); 
 int op; 
 System.out.println("Selecione uma opcao:"); 
 System.out.println("1 - Agendar Procedimento\n" 
 + "2 - Ver resultado de exame\n" 
 + "3 - Mudar data de procedimento"); 
 op = entrada.nextInt(); 
 switch(op) { 
 case 1: 
 agendarProcedimento(); 
 break; 
 case 2: 
 verResultadoExame(); 
 break; 
 case 3: 
 mudarDataProcedimento(); 
 break; 
 default: 
 System.out.println("Opcao invalida"); 
 } 
 } 
 
 
 
 
Implementação 
continua-> 
public Date selecionarData() { 
 Scanner entrada = new Scanner(System.in); 
 int dia,mes,ano; 
 int hora,minuto,segundo; 
 System.out.println("Data: dd/mm/yyyy"); 
 dia = entrada.nextInt(); 
 mes = entrada.nextInt(); 
 ano = entrada.nextInt(); 
 System.out.println("Hora: hh:mm"); 
 hora = entrada.nextInt(); 
 minuto = entrada.nextInt(); 
 Calendar c = Calendar.getInstance(); 
 c.set(ano, mes, dia, hora, minuto); 
 return c.getTime(); 
 } 
 
 
 
 
Implementação 
 public void agendarProcedimento() { 
 Scanner entrada = new Scanner(System.in); 
 int op; 
 
 // Seleciona tipo do procedimento 
 System.out.println("Procedimento: 1-consulta 2-exame"); 
 op = entrada.nextInt(); 
 
 
 
 
Implementação 
continua -> 
 if(op == 1) { 
 System.out.println("Especialidade da consulta"); 
 System.out.println("1 - Clinico Geral, 2 - Cardiologia, 3 - Dermatologia"); 
 int especialidade = entrada.nextInt(); 
 Consulta.verificaDataHoraDisponivel(especialidade); 
 System.out.println("1 - Agendar, 2 - sair"); 
 op = entrada.nextInt(); 
 if(op == 1) { 
 if(socioPlano.atingiuCotaMaximaConsulta()) { 
 System.out.println("Sinto muito voce atingiu a cota maxima"); 
 } 
 else { 
 Date dataHora = selecionarData(); 
 procedimento = new Consulta(dataHora,especialidade); 
 socioPlano.getProcedimentos().add(procedimento); 
 } 
 
 } 
 } 
} 
 
 
 
 
Implementação 
continua -> 
 else if(op == 2) { 
 System.out.println("Tipo do exame"); 
 System.out.println("1 - Sangue, 2 - Fezes, 3 - Urina"); 
 int tipoExame = entrada.nextInt(); 
 Exame.verificaDataHoraDisponivel(tipoExame); 
 System.out.println("1 - Agendar, 2 - sair"); 
 op = entrada.nextInt(); 
 if(op == 1) { 
 if(socioPlano.atingiuCotaMaximaExame()) { 
 System.out.println("Sinto muito voce atingiu a cota maxima"); 
 } 
 else { 
 Date dataHora = selecionarData(); 
 procedimento = new Exame(dataHora,tipoExame); 
 socioPlano.getProcedimentos().add(procedimento); 
 } 
 
 } 
 } 
 
 } 
 
 
 
 
Implementação 
continua -> 
 public void verResultadoExame() { 
 socioPlano.verResultadoExame(); 
 } 
 
 public void mudarDataProcedimento() { 
 Scanner entrada = new Scanner(System.in); 
 int op; 
 // Seleciona tipo do procedimento 
 System.out.println("Procedimento: 1-consulta 2-exame"); 
 op = entrada.nextInt(); 
 
 // Seleciona procedimento 
 if(op == 1) { 
 socioPlano.listarConsultas(); 
 Consulta.verificaDataHoraDisponivel(op); 
 System.out.println("1 - Trocar, 2 - sair"); 
 op = entrada.nextInt(); 
 
 
 
 
Implementação 
continua -> 
 if(op == 1) { 
 System.out.println("Selecione a consulta"); 
 int i = entrada.nextInt(); 
 Date novaDataHora = selecionarData(); 
 this.socioPlano.getProcedimentos().get(i).setDataHora(novaDataHora); 
 } 
 } 
 else if(op == 2) { 
 socioPlano.listarExames(); 
 Exame.verificaDataHoraDisponivel(op); 
 System.out.println("1 - Trocar, 2 - sair"); 
 op = entrada.nextInt(); 
 if(op == 1) { 
 System.out.println("Selecione o exame"); 
 int i = entrada.nextInt(); 
 Date novaDataHora = selecionarData(); 
 this.socioPlano.getProcedimentos().get(i).setDataHora(novaDataHora); 
 } 
 
 } 
 } 
} 
 
 
 
 
Implementação 
package questao_2; 
public class FacadeDemo { 
 
 /** 
 * @param args the command line arguments 
 */ 
 public static void main(String[] args) { 
 ProcedimentoFacadeSingleton facade = 
ProcedimentoFacadeSingleton.instance(); 
 facade.inicializarSocio(); 
 facade.menu(); 
 } 
 
} 
 
 
 
 
 
Implementação 
3º) Considere um sistema legado que fornece o serviço consultaServiço que recebe três 
parâmetros: dia, mês e ano (todos int), e que apenas os imprime na tela. 
Construa, usando o padrão adapter, um software que envia mensagens para este sistema 
legado fornecendo um parâmetro do tipo java.util.Date (ou equivalente em outra linguagem 
de programação). 
Diagrama de classes 
package questao_3; 
public class SistemaLegado { 
 public void consultaServico(int dia, int mes, int ano) { 
 System.out.println("Data: "+dia+"/ "+mes+"/ "+ano); 
 } 
} 
 
package questao_3; 
import java.util.Calendar; 
import java.util.Date; 
public class AdapterData extends Target { 
 private SistemaLegado sistemaLegado = new SistemaLegado(); 
 @Override 
 public void consultaServico(Date data) { 
 Calendar c = Calendar.getInstance(); 
 c.setTime(data); 
 sistemaLegado.consultaServico(c.get(Calendar.DAY_OF_MONTH), 
 c.get(Calendar.MONTH), c.get(Calendar.YEAR)); 
 } 
} 
Implementação 
package questao_3; 
import java.util.Date; 
public class Target { 
 public void consultaServico(Date data) { 
 // implementacao normal do metodo se necessario 
 } 
} 
 
package questao_3; 
import java.util.Calendar; 
public class Cliente { 
 public static void main(String args[]) { 
 Target t = new AdapterData(); 
 Calendar c = Calendar.getInstance(); 
 c.set(2016, 03, 16); 
 t.consultaServico(c.getTime()); 
 } 
} 
 
 
Implementação 
Saída na Tela 
4º) Na página http://www.ybadoo.com.br/tutoriais/poo/10/28/ há um programa que adota a 
abordagem Observer para notificar o recebimento de um e-mail por diversos meios, virtuais, 
representando dispositivos reais. Complementar o programa para que a notificação para 
Watch ocorra apenas para mensagens cujo remetente seja do domínio "@ufpa.br”. 
package questao_4; 
/** 
 * ConcreteObservable 
 */ 
public class Watch implements Subscriber 
{ 
 /* (non-Javadoc) 
 * @see com.ybadoo.tutoriais.poo.Subscriber#update(com.ybadoo.tutoriais.poo.Email) 
 */ 
 public void update(Email email) 
 { 
 // Adiciona um if para que apenas os emails recebidos de @ufpa.br sejam notificados 
 if(email.getSender().endsWith("@ufpa.br")) 
 System.out.println("Watch: " + email.getSubject() + " from " + 
email.getSender()); 
 } 
} 
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
http://www.ybadoo.com.br/tutoriais/poo/10/28/
Saída na Tela 
5º) Obs: Adaptado de https://sites.google.com/site/diogodmoreira/padroes-20142 Uma 
sorveteria precisa criar um sistema para cadastrar os pedidos dos seus clientes. Os 
sorvetes podem ser servidos em Copo (R$0.20), Taça (sem custo) ou Casquinha (R$1.50). 
Atualmente, elescontam com 5 sabores de sorvete: ’Chocolate’, ’Morango’, ’Flocos’, ’Pavê’ 
e ’Napolitano’ (R$1.50 cada bola) ou ‘Chocolate Diet’ (R$ 2.00 a bola). Além disso, os 
clientes podem acrescentar: Cobertura de Chocolate, Morango ou Caramelo (que custa R$ 
0.50). 
Utilizando o Padrão Decorator para resolver este problema. 
https://sites.google.com/site/diogodmoreira/padroes-20142
https://sites.google.com/site/diogodmoreira/padroes-20142
https://sites.google.com/site/diogodmoreira/padroes-20142
Diagrama de classes 
package questao_5; 
public abstract class Sorvete { 
 protected double preco; 
 protected String nome; 
 public void setPreco(double preco) { 
 this.preco = (preco >= 0)?preco:0; 
 } 
 public void setNome(String nome) { 
 this.nome = nome; 
 } 
 public double getPreco() { 
 return preco; 
 } 
 public String getNome() { 
 return nome; 
 } 
Implementação 
package questao_5; 
public abstract class Recipiente extends Sorvete { 
 protected SaborDecorator primBolaSorvete; 
 public Recipiente(SaborDecorator primBolaSorvete) { 
 this.primBolaSorvete = primBolaSorvete; 
 setPreco(primBolaSorvete.preco); 
 setNome(primBolaSorvete.nome); 
 } 
} 
 
package questao_5; 
public class Copo extends Recipiente { 
 public Copo(SaborDecorator primBolaSorvete) { 
 super(primBolaSorvete); 
 setPreco(0.20 + preco); 
 setNome("Copo" + " + " + nome); 
 } 
} 
Implementação 
package questao_5; 
public abstract class SorveteDecorator extends Sorvete { 
 protected Sorvete sorvete; 
 public SorveteDecorator() {} 
 public SorveteDecorator(Sorvete umSorvete) { 
 this.sorvete = umSorvete; 
 } 
 @Override 
 public double getPreco() { 
 return sorvete.getPreco() + preco; 
 } 
 @Override 
 public String getNome() { 
 return sorvete.getNome() + " + " + nome; 
} 
} 
Implementação 
package questao_5; 
public abstract class SaborDecorator extends SorveteDecorator { 
 public SaborDecorator(Sorvete umSorvete) { 
 super(umSorvete); 
 setNome("Sabor"); 
 } 
 public SaborDecorator() { 
 super(); 
 setNome("Sabor"); 
 } 
} 
 
 
Implementação 
Implementação 
package questao_5; 
public class FlocosSaborDecorator extends SaborDecorator { 
 public FlocosSaborDecorator(Sorvete 
umSorvete) { 
 super(umSorvete); 
 setNome(nome + " " + "Flocos"); 
 setPreco(1.50); 
 } 
 public FlocosSaborDecorator() { 
 setNome(nome + " " + "Flocos"); 
 setPreco(1.50); 
 } 
} 
 
package questao_5; 
public abstract class CoberturaDecorator extends SorveteDecorator { 
 
 public CoberturaDecorator(Sorvete umSorvete) { 
 super(umSorvete); 
 setNome("Cobertura de"); 
 } 
} 
 
package questao_5; 
public class MorangoCoberturaDecorator extends CoberturaDecorator { 
 
 public MorangoCoberturaDecorator(Sorvete umSorvete) { 
 super(umSorvete); 
 setNome(nome + " " + "Morango"); 
 setPreco(0.50); 
 } 
} 
 
Implementação 
package questao_5; 
public class SorveteDemo { 
 
 /** 
 * @param args the command line arguments 
 */ 
 public static void main(String[] args) { 
 Sorvete meuSorvete = new Copo(new ChocolateSaborDecorator()); 
 System.out.println("Sorvete basico:"); 
 System.out.println(meuSorvete.getNome() + " = " 
 + "R$ " + meuSorvete.getPreco()); 
 
 System.out.println("Adicionando mais coisas no sorvete:"); 
 meuSorvete = new FlocosSaborDecorator(meuSorvete); 
 meuSorvete = new CarameloCoberturaDecorator(meuSorvete); 
 meuSorvete = new MorangoSaborDecorator(meuSorvete); 
 meuSorvete = new ChocolateCoberturaDecorator(meuSorvete); 
 System.out.println(meuSorvete.getNome() + " = " 
 + "R$ " + meuSorvete.getPreco()); 
 System.out.println(); 
 
Implementação 
continua -> 
 meuSorvete = new Casquinha(new MorangoSaborDecorator()); 
 System.out.println("Sorvete basico:"); 
 System.out.println(meuSorvete.getNome() + " = " 
 + "R$ " + meuSorvete.getPreco()); 
 
 System.out.println("Adicionado mais coisas no sorvete:"); 
 meuSorvete = new PaveSaborDecorator(meuSorvete); 
 meuSorvete = new MorangoCoberturaDecorator(meuSorvete); 
 meuSorvete = new ChocolateSaborDecorator(meuSorvete); 
 System.out.println(meuSorvete.getNome() + " = " 
 + "R$ " + meuSorvete.getPreco()); 
 } 
 
} 
Implementação 
Saída na Tela

Continue navegando