Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
PADRÕES DE PROJETO DE SOFTWARE Aula 7 – Padrões Comportamentais GoF PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE O que veremos nesta sétima aula Finalizar o estudo da família de padrões comportamentais GoF; Conhecer os últimos padrões comportamentais Observer, State, Strategy e Visitor; Aprender as principais aplicações e funcionalidades destes padrões; PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Classificação dos padrões GoF segundo Metsker [2] PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Visitor "Representar uma operação a ser realizada sobre os elementos de uma estrutura de objetos. Visitor permite definir uma nova operação sem mudar as classes dos elementos nos quais opera “ [GoF] PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Problema PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo 1 PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo 2 ... Visitor gravidade = new Gravidade(); //esse é o nosso visitor, responsável pelo comportamento de queda. Solido solido = new Solido("caixa"); //solido que recebera o comportamento solido.accept(gravidade); //recebe o comportamento Gravidade ... ... public void accept(Visitor visitor) { visitor.visitSolido(this); } ... PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo 3 PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Observer "Definir uma dependência um-para-muitos entre objetos para que quando um objeto mudar de estado, todos os seus dependentes sejam notificados e atualizados automaticamente." [GoF] PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public interface Sirene { public void adicionarObservador( Operario o ); public void removerObservador( Operario o ); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public interface Operario { public void atualizar(Sirene s); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo import java.util.ArrayList; import java.util.Iterator; public class SireneConcreta implements Sirene { private Boolean alertaSonoro = false; private ArrayList observadores = new ArrayList(); public void alterarAlerta(){ if(alertaSonoro) alertaSonoro = false; else alertaSonoro = true; notificarObservadores(); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public Boolean getAlerta(){ return alertaSonoro; } public void adicionarObservador(Operario o) { observadores.add(o); } public void removerObservador(Operario o) { observadores.remove(o); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo private void notificarObservadores(){ Iterator i = observadores.iterator(); while(i.hasNext()){ Operario o = (Operario) i.next(); o.update(this); } } } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class OperarioConcreto implements Operario { private SireneConcreta objetoObservado; public OperarioConcreto(SireneConcreta o){ this.objetoObservado = o; objetoObservado.adicionarObservador(this); } public void atualizar(Sirene s) { if(s == objetoObservado){ System.out.println("[INFO] A Sirene mudou seu estado para: " + objetoObservado.getAlerta()); } } } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class GerenciadorSirene { public static void main(String[] args) { SireneConcreta sirene = new SireneConcreta(); OperarioConcreto obs1 = new OperarioConcreto(sirene); OperarioConcreto obs2 = new OperarioConcreto(sirene); sirene.alterarAlerta(); sirene.alterarAlerta(); } } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE State "Permitir a um objeto alterar o seu comportamento quanto o seu estado interno mudar. O objeto irá aparentar mudar de classe." [GoF] PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Problema PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class Conectado implements ConexaoState { public void conectar(Conexao conexao) { System.out.println("Estado inválido, já conectado"); } public void desconectar(Conexao conexao) { // Muda estado da conexão para desconectado, instanciando nova classe conexao.setState(new Desconectado()); } public void enviarRequisicao(Requisicao requisicao, Conexao conexao) { // Enviar requisição e mudar estado para aguardando resposta conexao.setState(new AguardandoResposta()); } public Resposta receberResposta(Conexao conexao) { System.out.println("Estado inválido,preciso estar no estado AguardandoResposta"); } } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Strategy "Definir uma família de algoritmos, encapsular cada um, e fazê-los intercambiáveis. Strategy permite que algoritmos mudem independentemente entre clientes que os utilizam." [GoF] PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Problema PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo 1 PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public enum Cargo { ATENDENTE, VENDEDOR, GERENTE; } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class Funcionario { private long id; private enum cargo; // Construtor, getters e setters . . . } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public interface Strategy { // Calcula comissão. double calcularComissao(double valorVenda); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public class Venda { private double valorVenda; private Funcionario funcionario; private Strategy calculoComissao; public Venda() {// Construtor [Implementa STRATEGY]. switch (funcionario.getCargo()) { case ATENDENTE : this.setCalculoComissao(new Strategy() { public double calcularComissao(double valorVenda) { return (valorVenda * 0.01); } }); break; PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo case VENDEDOR : this.setCalculoComissao(new Strategy() { public double calcularComissao(double valorVenda) { return (valorVenda * 0.02); } }); break; case GERENTE : this.setCalculoComissao(new Strategy() { public double calcularComissao(double valorVenda) { return (valorVenda * 0.03); } }); break; PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo } } private void setCalculoComissao(Strategy calculoComissao) { this.calculoComissao= calculoComissao; } private Strategy getCalculoComissao() { return (this.calculoComissao); } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Exemplo public void save() { //. . . /* * Calcula o valor da comissão de venda sem que haja a necessidade de * verificar qual o tipo cargo toda vez que o metodo <b>save</b> for * executado. */ final double valorComissao = this.getCalculoComissao().calcularComissao(this.valorVenda); // . . . } } } PADRÕES COMPORTAMENTAIS GOF – AULA 7 PADRÕES DE PROJETO DE SOFTWARE Bibliografia Utilizando UML e Padrões: uma introdução à análise e ao projeto orientados a objetos - 3ª Edição Autor: Larman, Craig Padrões de Projeto: soluções reutilizáveis de software orientado a objetos Autor: Gamma, Erich ... [et al] * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Compartilhar