Baixe o app para aproveitar ainda mais
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
Compartilhar