Aula 06 - UML e Padrões de Projeto
-
Upload
vinicius-de-paula -
Category
Education
-
view
499 -
download
0
Transcript of Aula 06 - UML e Padrões de Projeto
Especialização em Desenvolvimento Java UML e Padrões de Projetos
AULA 06 – PADRÕES ESTRUTURAIS
Prof. Vinícius de Paula -‐ [email protected]
Padrões Estruturais
Padrões Estruturais As interações entre os objetos de um sistema podem gerar fortes dependências entre esses elementos.
UML e Padrões de Projeto Centro Universitário do Triângulo 3
Padrões Estruturais As interações entre os objetos de um sistema podem gerar fortes dependências entre esses elementos.
• Essas dependências aumentam a complexidade das eventuais alterações no funcionamento do sistema.
UML e Padrões de Projeto Centro Universitário do Triângulo 4
Padrões Estruturais As interações entre os objetos de um sistema podem gerar fortes dependências entre esses elementos.
• Essas dependências aumentam a complexidade das eventuais alterações no funcionamento do sistema.
• Consequentemente, o custo de manutenção aumenta.
UML e Padrões de Projeto Centro Universitário do Triângulo 5
Padrões Estruturais As interações entre os objetos de um sistema podem gerar fortes dependências entre esses elementos.
• Essas dependências aumentam a complexidade das eventuais alterações no funcionamento do sistema.
• Consequentemente, o custo de manutenção aumenta.
Veremos alguns padrões de projeto estruturais que diminuem o acoplamento entre os objetos de um sistema orientado a objetos.
UML e Padrões de Projeto Centro Universitário do Triângulo 6
Adapter
Adapter ObjeSvo segundo o GoF:
UML e Padrões de Projeto Centro Universitário do Triângulo 8
Adapter ObjeSvo segundo o GoF:
• Converter a interface de uma classe em outra interface esperada pelos clientes.
UML e Padrões de Projeto Centro Universitário do Triângulo 9
Adapter ObjeSvo segundo o GoF:
• Converter a interface de uma classe em outra interface esperada pelos clientes.
• Adapter permite a comunicação entre classes que não poderiam trabalhar juntas devido à incompaSbilidade de suas interfaces.
UML e Padrões de Projeto Centro Universitário do Triângulo 10
Adapter ObjeSvo segundo o GoF:
• Converter a interface de uma classe em outra interface esperada pelos clientes.
• Adapter permite a comunicação entre classes que não poderiam trabalhar juntas devido à incompaSbilidade de suas interfaces.
UML e Padrões de Projeto Centro Universitário do Triângulo 11
Permitir que um objeto seja substituído por outro que, apesar de realizar a mesma tarefa, possui uma interface diferente.
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 12
Estrutura do Adapter, segundo GoF (pág. 159)
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 13
Estrutura do Adapter, segundo GoF (pág. 159)
Define a interface uSlizada pelo Client
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 14
Estrutura do Adapter, segundo GoF (pág. 159)
Define a interface uSlizada pelo Client
Define o novo objeto a ser uSlizado
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 15
Estrutura do Adapter, segundo GoF (pág. 159)
Define a interface uSlizada pelo Client
Define o novo objeto a ser uSlizado
Implementa a interface definida pelo Target e adapta as chamadas do Client para o Adaptee
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 16
Sistema existente Classe do novo fornecedor
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 17
Sistema existente Classe do novo fornecedor
A interface não é compatível, e não queremos resolver o problema mudando o código existente.
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 18
Sistema existente Classe do novo fornecedor
Adaptador
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 19
Sistema existente Classe do novo fornecedor
Adaptador
O adaptador implementa a interface que as classes do sistema existente espera.
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 20
Sistema existente Classe do novo fornecedor
Adaptador
E se comunica com a interface do novo fornecedor para atender as solicitações do sistema existente.
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 21
Sistema existente
Classe do novo
fornecedor
Adaptador
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 22
Sistema existente
Classe do novo
fornecedor
Adaptador
Nenhuma* alteração no código
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 23
Sistema existente
Classe do novo
fornecedor
Adaptador
Nenhuma alteração no código Nenhuma* alteração no código
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 24
Sistema existente
Classe do novo
fornecedor
Adaptador
Nenhuma* alteração no código Nenhuma alteração no código Novo código
Adapter Cenário Prá=co
Estamos realizando uma manutenção no sistema de gerenciamento de uma determinada empresa. O controle de ponto desse sistema possui diversas limitações. Essas limitações causam muitos prejuízos, principalmente financeiros.
UML e Padrões de Projeto Centro Universitário do Triângulo 25
Adapter Cenário Prá=co
Estamos realizando uma manutenção no sistema de gerenciamento de uma determinada empresa. O controle de ponto desse sistema possui diversas limitações. Essas limitações causam muitos prejuízos, principalmente financeiros.
Uma empresa parceira implementou uma biblioteca Java para controlar a entrada e saída dos funcionários. Essa biblioteca não possui as limitações que existem hoje no sistema que estamos realizando manutenção. Os diretores decidiram que a melhor estratégia seria adquirir esta biblioteca e implantá-‐la no sistema.
UML e Padrões de Projeto Centro Universitário do Triângulo 26
Adapter Cenário Prá=co
Para implantar esta biblioteca, teremos que subsStuir as classes que atualmente cuidam do controle de ponto pelas classes desta biblioteca.
UML e Padrões de Projeto Centro Universitário do Triângulo 27
Adapter Cenário Prá=co
Para implantar esta biblioteca, teremos que subsStuir as classes que atualmente cuidam do controle de ponto pelas classes desta biblioteca.
A complexidade desta desta subsStuição é alta pois os métodos das classes anSgas não são compa\veis com os métodos das classes novas. Em outras palavras, as interfaces são diferentes.
UML e Padrões de Projeto Centro Universitário do Triângulo 28
Adapter Como podemos tentar minimizar o impacto desta subsStuição de código?
UML e Padrões de Projeto Centro Universitário do Triângulo 29
Adapter Como podemos tentar minimizar o impacto desta subsStuição de código?
UML e Padrões de Projeto Centro Universitário do Triângulo 30
Definindo classes intermediárias para adaptar as chamadas às classes da biblioteca que foi adquirida.
Adapter Cenário Prá=co
Atualmente a entrada de um funcionário é registrada da seguintes maneira:
UML e Padrões de Projeto Centro Universitário do Triângulo 31
ControleDePonto controleDePonto = new ControleDePonto();Funcionario funcionario = new Funcionario("Jose da Silva");controleDePonto.registraEntrada(funcionario);
Adapter Cenário Prá=co
Atualmente a entrada de um funcionário é registrada da seguintes maneira:
UML e Padrões de Projeto Centro Universitário do Triângulo 32
ControleDePonto controleDePonto = new ControleDePonto();Funcionario funcionario = new Funcionario("Jose da Silva");controleDePonto.registraEntrada(funcionario);
O método registraEntrada espera um objeto do Spo
Funcionario
Adapter Cenário Prá=co
USlizando as classes da nova biblioteca, a entrada de um novo funcionário deveria ser registrada assim:
UML e Padrões de Projeto Centro Universitário do Triângulo 33
ControleDePontoNovo controleDePontoNovo = ...Funcionario funcionario = ...// true indica entrada e false indica saída controleDePontoNovo.registra(funcionario.getCodigo(), true);
Adapter Cenário Prá=co
USlizando as classes da nova biblioteca, a entrada de um novo funcionário deveria ser registrada assim:
UML e Padrões de Projeto Centro Universitário do Triângulo 34
ControleDePontoNovo controleDePontoNovo = ...Funcionario funcionario = ...// true indica entrada e false indica saída controleDePontoNovo.registra(funcionario.getCodigo(), true);
O método registra recebe dois argumentos, o ID do funcionário e um booleano indicando se o registro se
trata da entrada ou saída do funcionário
Adapter • Para diminuir o impacto no código do sistema, podemos criar o seguinte adaptador:
UML e Padrões de Projeto Centro Universitário do Triângulo 35
Adapter • Para diminuir o impacto no código do sistema, podemos criar o seguinte adaptador:
UML e Padrões de Projeto Centro Universitário do Triângulo 36
public class ControleDePontoAdapter extends ControleDePonto {
private ControleDePontoNovo controleDePontoNovo;
public void registraEntrada(Funcionario funcionario) {
this.controleDePontoNovo.registra(funcionario.getCodigo(), true); }}
Adapter • Para diminuir o impacto no código do sistema, podemos criar o seguinte adaptador:
UML e Padrões de Projeto Centro Universitário do Triângulo 37
public class ControleDePontoAdapter extends ControleDePonto {
private ControleDePontoNovo controleDePontoNovo;
public void registraEntrada(Funcionario funcionario) {
this.controleDePontoNovo.registra(funcionario.getCodigo(), true); }}
A interface conhecida pelo sistema existente é mantida pelo adaptador
Adapter • Para diminuir o impacto no código do sistema, podemos criar o seguinte adaptador:
UML e Padrões de Projeto Centro Universitário do Triângulo 38
public class ControleDePontoAdapter extends ControleDePonto {
private ControleDePontoNovo controleDePontoNovo;
public void registraEntrada(Funcionario funcionario) {
this.controleDePontoNovo.registra(funcionario.getCodigo(), true); }}
A chamada ao método da nova biblioteca é encapsulada pelo adaptador
Adapter • Podemos uSlizar o adaptador como se esSvéssemos uSlizando o controle de ponto anSgo.
UML e Padrões de Projeto Centro Universitário do Triângulo 39
Adapter • Podemos uSlizar o adaptador como se esSvéssemos uSlizando o controle de ponto anSgo.
UML e Padrões de Projeto Centro Universitário do Triângulo 40
ControleDePonto controleDePonto = new ControleDePontoAdapter();Funcionario funcionario = ...controleDePonto.registraEntrada(funcionario);
Adapter • Podemos uSlizar o adaptador como se esSvéssemos uSlizando o controle de ponto anSgo.
UML e Padrões de Projeto Centro Universitário do Triângulo 41
ControleDePonto controleDePonto = new ControleDePontoAdapter();Funcionario funcionario = ...controleDePonto.registraEntrada(funcionario);
Dessa forma, o código do sistema atual deve ser modificado apenas no trecho em que a classe responsável pelo controle
de ponto é instanciada.
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 42
Modelo de Classes do Cenário Prá=co
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 43
public class Funcionario {
private String nome;
public Funcionario(String nome) {
this.nome = nome; }
public String getNome() {
return nome; }}
Defina uma classe Funcionario
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 44
public class ControleDePonto {
public void registraEntrada(Funcionario f) {
Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy H:m:s");
String format = simpleDateFormat.format(calendar.getTime()); System.out.println("Entrada: " + f.getNome() + " às " + format); }
public void registraSaida(Funcionario f) {
Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy H:m:s");
String format = simpleDateFormat.format(calendar.getTime()); System.out.println("Saída: " + f.getNome() + " às " + format); }}
Defina a classe de controle de ponto utilizada pelo sistema atual
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 45
public class TestaControleDePonto {
public static void main(String[] args) throws InterruptedException {
ControleDePonto controleDePonto = new ControleDePonto(); Funcionario funcionario = new Funcionario("Jose da Silva");
controleDePonto.registraEntrada(funcionario);
Thread.sleep(5000);
controleDePonto.registraSaida(funcionario); }}
Teste a classe de controle de ponto
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 46
public class ControleDePontoNovo {
public void registra(Funcionario f, boolean entrada) {
Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy H:m:s"); String format = simpleDateFormat.format(calendar.getTime());
if (entrada == true) {
System.out.println("Entrada: " + f.getNome() + " às " + format);
} else {
System.out.println("Saída: " + f.getNome() + " às " + format);
} }}
Defina a classe da nova biblioteca
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 47
public class ControleDePontoAdapter extends ControleDePonto{
private ControleDePontoNovo controleDePontoNovo;
public ControleDePontoAdapter() {
this.controleDePontoNovo = new ControleDePontoNovo(); }
public void registraEntrada(Funcionario f) {
this.controleDePontoNovo.registra(f, true); }
public void registraSaida(Funcionario f) {
this.controleDePontoNovo.registra(f, false); }}
Defina a classe do adaptador
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 48
public class TestaControleDePonto {
public static void main(String[] args) throws InterruptedException {
ControleDePonto controleDePonto = new ControleDePontoAdapter(); Funcionario funcionario = new Funcionario("Jose da Silva");
controleDePonto.registraEntrada(funcionario);
Thread.sleep(5000);
controleDePonto.registraSaida(funcionario); }}
Altere a classe de teste para utilizar o adaptador
Adapter
UML e Padrões de Projeto Centro Universitário do Triângulo 49
public class TestaControleDePonto {
public static void main(String[] args) throws InterruptedException {
ControleDePonto controleDePonto = new ControleDePontoAdapter(); Funcionario funcionario = new Funcionario("Jose da Silva");
controleDePonto.registraEntrada(funcionario);
Thread.sleep(5000);
controleDePonto.registraSaida(funcionario); }}
Única modificação no código do cliente que utiliza o sistema atual
Decorator
Decorator ObjeSvo segundo o GoF:
UML e Padrões de Projeto Centro Universitário do Triângulo 51
Decorator ObjeSvo segundo o GoF:
• Anexar responsabilidades adicionais a um objeto dinamicamente.
UML e Padrões de Projeto Centro Universitário do Triângulo 52
Decorator ObjeSvo segundo o GoF:
• Anexar responsabilidades adicionais a um objeto dinamicamente. • Decorators oferecem uma alternaSva flexível ao uso de herança para estender uma funcionalidade.
UML e Padrões de Projeto Centro Universitário do Triângulo 53
Decorator ObjeSvo segundo o GoF:
• Anexar responsabilidades adicionais a um objeto dinamicamente. • Decorators oferecem uma alternaSva flexível ao uso de herança para estender uma funcionalidade.
UML e Padrões de Projeto Centro Universitário do Triângulo 54
Adicionar funcionalidades a um objeto dinamicamente.
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 55
Estrutura do Decorator, segundo GoF (pág. 199)
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 56
Estrutura do Decorator, segundo GoF (pág. 199)
Define a interface de objetos que possuem determinada tarefa
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 57
Estrutura do Decorator, segundo GoF (pág. 199)
Define a interface de objetos que possuem determinada tarefa
Implementação parScular do Component
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 58
Estrutura do Decorator, segundo GoF (pág. 199)
Define a interface de objetos que possuem determinada tarefa
Implementação parScular do Component
Classe abstrata que mantém uma referência para um
Component e será uSlizada para padronizar os objetos
decoradores
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 59
Estrutura do Decorator, segundo GoF (pág. 199)
Define a interface de objetos que possuem determinada tarefa
Implementação parScular do Component
Classe abstrata que mantém uma referência para um
Component e será uSlizada para padronizar os objetos
decoradores
Implementação de um Decorator
Decorator Cenário Prá=co
Como no exemplo práSco do padrão Factory Method, consideremos um sistema de envio de mensagens.
UML e Padrões de Projeto Centro Universitário do Triângulo 60
Decorator Cenário Prá=co
Como no exemplo práSco do padrão Factory Method, consideremos um sistema de envio de mensagens.
Nesse cenário, definimos uma interface para padronizar os emissores:
UML e Padrões de Projeto Centro Universitário do Triângulo 61
public interface Emissor {
void envia(String mensagem);}
Decorator Cenário Prá=co
Um possível emissor, poderia ser implementado da seguinte maneira:
UML e Padrões de Projeto Centro Universitário do Triângulo 62
public class EmissorBasico implements Emissor {
public void envia(String mensagem) {
System.out.println("Enviando uma mensagem: "); System.out.println(mensagem); } }
Decorator Cenário Prá=co
Suponhamos que agora estejamos interessados em adicionar algumas funcionalidades no processo de envio de mensagem.
Tais funcionalidades incluem criptografia e compressão de mensagens.
UML e Padrões de Projeto Centro Universitário do Triângulo 63
Decorator Como podemos implementar funcionalidades adicionais sem alterar as classes que definem os emissores?
UML e Padrões de Projeto Centro Universitário do Triângulo 64
Decorator Como podemos implementar funcionalidades adicionais sem alterar as classes que definem os emissores?
UML e Padrões de Projeto Centro Universitário do Triângulo 65
Cada funcionalidade adicional (decoração) será implementada por um novo objeto (Decorator).
Decorator Alguns pontos para se pensar:
UML e Padrões de Projeto Centro Universitário do Triângulo 66
Decorator Alguns pontos para se pensar:
• Quando quisermos enviar uma mensagem não podemos chamar diretamente os emissores, pois as funcionalidades adicionais não serão executadas.
UML e Padrões de Projeto Centro Universitário do Triângulo 67
Decorator Alguns pontos para se pensar:
• Quando quisermos enviar uma mensagem não podemos chamar diretamente os emissores, pois as funcionalidades adicionais não serão executadas.
• Devemos entregar a mensagem a um decorador que executará a tarefa para a qual foi concebido.
UML e Padrões de Projeto Centro Universitário do Triângulo 68
Decorator Alguns pontos para se pensar:
• Quando quisermos enviar uma mensagem não podemos chamar diretamente os emissores, pois as funcionalidades adicionais não serão executadas.
• Devemos entregar a mensagem a um decorador que executará a tarefa para a qual foi concebido.
• O decorador por sua vez terá a responsabilidade repassar a mensagem a um emissor para que ela seja enviada. Dessa forma, todo decorador deve possuir um emissor.
UML e Padrões de Projeto Centro Universitário do Triângulo 69
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 70
Modelo de Classes do Cenário Prá=co
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 71
public abstract class EmissorDecorator implements Emissor {
private Emissor emissor;
public EmissorDecorator(Emissor emissor) {
this.emissor = emissor;}
public abstract void envia(String mensagem);
public Emissor getEmissor () {
return this.emissor;
}}
Defina uma classe para modelar o decorador de emissores
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 72
Crie um decorador que envia mensagens criptografadas
public class EmissorDecoratorComCriptografia extends EmissorDecorator{
public EmissorDecoratorComCriptografia(Emissor emissor) {
super(emissor); } public void envia(String mensagem) {
System.out.println("Enviando mensagem criptografada: "); this.getEmissor().envia(criptografa(mensagem)); } private String criptografa(String mensagem) {
String mensagemCriptografada = new StringBuilder(mensagem).reverse().toString(); return mensagemCriptografada; }}
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 73 Crie um decorador que envia mensagens comprimidas
public class EmissorDecoratorComCompressao extends EmissorDecorator {
public EmissorDecoratorComCompressao(Emissor emissor) {
super(emissor); } public void envia(String mensagem) {
System.out.println("Enviando mensagem comprimida: "); String mensagemComprimida;
try {
mensagemComprimida = comprime(mensagem);
} catch (IOException e) {
mensagemComprimida = mensagem; } this.getEmissor().envia(mensagemComprimida); }// continua...
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 74
Crie um decorador que envia mensagens comprimidas
private String comprime(String mensagem) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream(); DeflaterOutputStream dout = new DeflaterOutputStream(out, new Deflater()); dout.write(mensagem.getBytes()); dout.close();
return new String(out.toByteArray()); }}
Decorator
UML e Padrões de Projeto Centro Universitário do Triângulo 75
Crie uma classe para testar os decoradores
public class TestaEmissorDecorator {
public static void main(String[] args) {
String mensagem = "teste"; Emissor emissorCript = new EmissorDecoratorComCriptografia(
new EmissorBasico()); emissorCript.envia(mensagem);
Emissor emissorCompr = new EmissorDecoratorComCompressao(new EmissorBasico());
emissorCompr.envia(mensagem);
Emissor emissorCriptCompr = new EmissorDecoratorComCriptografia(new EmissorDecoratorComCompressao(new EmissorBasico()));
emissorCriptCompr.envia(mensagem); }}
Decorator Consequências de se usar decoradores:
UML e Padrões de Projeto Centro Universitário do Triângulo 76
Decorator Consequências de se usar decoradores:
• Mais flexibilidade que herança estáSca;
• O modelo tende a ficar mais simples e uniforme.
UML e Padrões de Projeto Centro Universitário do Triângulo 77
Decorator Consequências de se usar decoradores:
• Mais flexibilidade que herança estáSca;
• O modelo tende a ficar mais simples e uniforme.
Entretanto:
UML e Padrões de Projeto Centro Universitário do Triângulo 78
Decorator Consequências de se usar decoradores:
• Mais flexibilidade que herança estáSca;
• O modelo tende a ficar mais simples e uniforme.
Entretanto:
• Apesar de um Decorator e o Component serem do mesmo Spo, não são o mesmo objeto;
• Proliferação de “pequenos” objetos que implementam as extensões.
UML e Padrões de Projeto Centro Universitário do Triângulo 79
Facade
Facade ObjeSvo segundo o GoF:
UML e Padrões de Projeto Centro Universitário do Triângulo 81
Facade ObjeSvo segundo o GoF:
• Oferecer uma interface única para um conjunto de interfaces de um subsistema.
UML e Padrões de Projeto Centro Universitário do Triângulo 82
Facade ObjeSvo segundo o GoF:
• Oferecer uma interface única para um conjunto de interfaces de um subsistema.
• Facade define uma interface de nível mais elevado que torna o subsistema mais fácil de usar.
UML e Padrões de Projeto Centro Universitário do Triângulo 83
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 84
Motivação para o uso do Facade, segundo GoF (pág. 208)
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 85
Motivação para o uso do Facade, segundo GoF (pág. 208)
Prover uma interface simplificada para a utilização de várias interfaces de um subsistema.
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 86
Estrutura do Facade, segundo GoF (pág. 210)
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 87
Estrutura do Facade, segundo GoF (pág. 210)
Classe intermediária que simplifica o acesso aos
componentes do subsistema
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 88
Estrutura do Facade, segundo GoF (pág. 210)
Classe intermediária que simplifica o acesso aos
componentes do subsistema
Componente que compõe o susbsistema
Facade Cenário Prá=co
Estamos fazendo algumas melhorias em um sistema que orquestra todos os procedimentos que devem ser realizados após o registro de um pedido.
UML e Padrões de Projeto Centro Universitário do Triângulo 89
Facade Cenário Prá=co
Estamos fazendo algumas melhorias em um sistema que orquestra todos os procedimentos que devem ser realizados após o registro de um pedido.
Quando um pedido é realizado, o módulo que gerencia o estoque deve ser avisado para que o produto seja encaminhado para o endereço de entrega.
UML e Padrões de Projeto Centro Universitário do Triângulo 90
Facade Cenário Prá=co
Estamos fazendo algumas melhorias em um sistema que orquestra todos os procedimentos que devem ser realizados após o registro de um pedido.
Quando um pedido é realizado, o módulo que gerencia o estoque deve ser avisado para que o produto seja encaminhado para o endereço de entrega.
O módulo financeiro deve ser avisado para que o processo de faturamento seja realizado.
UML e Padrões de Projeto Centro Universitário do Triângulo 91
Facade Cenário Prá=co
Estamos fazendo algumas melhorias em um sistema que orquestra todos os procedimentos que devem ser realizados após o registro de um pedido.
Quando um pedido é realizado, o módulo que gerencia o estoque deve ser avisado para que o produto seja encaminhado para o endereço de entrega.
O módulo financeiro deve ser avisado para que o processo de faturamento seja realizado.
O módulo de pós venda também deve ser avisado para que contatos futuros sejam realizados com o cliente com o intuito de verificar a saSsfação do mesmo com o produto adquirido.
UML e Padrões de Projeto Centro Universitário do Triângulo 92
Facade Cenário Prá=co
O sistema realiza todos os processos decorrentes da realização de um novo pedido da seguinte forma:
UML e Padrões de Projeto Centro Universitário do Triângulo 93
Facade Cenário Prá=co
O sistema realiza todos os processos decorrentes da realização de um novo pedido da seguinte forma:
UML e Padrões de Projeto Centro Universitário do Triângulo 94
Pedido p = ...estoque.enviaProduto(p.getProduto(), p.getEnderecoDeEntrega(), p.getProdutoID()); finaceiro.fatura(p.getCliente(), p.getProduto(), p.getProdutoID());posVenda.agendaContato(p.getCliente(), p.getProduto());
Facade Cenário Prá=co
Como podemos simplificar essa lógica?
UML e Padrões de Projeto Centro Universitário do Triângulo 95
Facade Cenário Prá=co
Como podemos simplificar essa lógica?
Criando uma classe que encapsula todos os processos que envolvem o acesso aos módulos de estoque, financeiro e pós venda.
UML e Padrões de Projeto Centro Universitário do Triângulo 96
Facade Cenário Prá=co
Como podemos simplificar essa lógica?
Criando uma classe que encapsula todos os processos que envolvem o acesso aos módulos de estoque, financeiro e pós venda.
UML e Padrões de Projeto Centro Universitário do Triângulo 97
PedidoFacade facade = new PedidoFacade(...);Pedido pedido = new Pedido(...);facade.registraPedido(pedido);
Facade Cenário Prá=co
Como podemos simplificar essa lógica?
Criando uma classe que encapsula todos os processos que envolvem acesso aos módulos de estoque, financeiro e pós venda.
UML e Padrões de Projeto Centro Universitário do Triângulo 98
PedidoFacade facade = new PedidoFacade(...);Pedido pedido = new Pedido(...);facade.registraPedido(pedido);
Dessa forma, quando um pedido é realizado não é mais necessário acessar diretamente diversos módulos diferentes, diminuindo
assim a complexidade das operações
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 99
Modelo de Classes do Cenário Prá=co
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 100
Defina a classe Pedido
public class Pedido {
private String produto; private String cliente; private String enderecoDeEntrega; private long pedidoID;
public Pedido(String produto, String cliente, String enderecoDeEntrega, long pedidoID) {
this.produto = produto; this.cliente = cliente; this.enderecoDeEntrega = enderecoDeEntrega; this.pedidoID = pedidoID; }
// getters e setters...
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 101
Defina a classe Financeiro
public class Financeiro {
public void fatura(String cliente, String produto, long pedidoID) {
System.out.println("Fatura:"); System.out.println("Pedido: " + pedidoID); System.out.println("Cliente: " + cliente); System.out.println("Produto: " + produto); }}
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 102
Defina a classe Estoque
public class Estoque {
public void enviaProduto(String produto, String enderecoDeEntrega, long pedidoID) {
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 2); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); String format = simpleDateFormat.format(calendar.getTime()); System.out.println("O pedido " + pedidoID + " contendo o produto " + produto + " sera ́ entregue no endereço " + enderecoDeEntrega + " até as 18h do dia " +format); }}
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 103
Defina a classe PosVenda
public class PosVenda {
public void agendaContato(String cliente, String produto) {
Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 3);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); String format = simpleDateFormat.format(calendar.getTime());
System.out.println("Entrar em contato com " + cliente+ " sobre o produto " + produto + " no dia " + format);
}}
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 104
Defina a classe PedidoFacade
public class PedidoFacade {
private Estoque estoque; private Financeiro financeiro; private PosVenda posVenda;
public PedidoFacade(Estoque estoque, Financeiro financeiro, PosVenda posVenda) {
this.estoque = estoque; this.financeiro = financeiro; this.posVenda = posVenda;
} public void registraPedido(Pedido p) {
this.estoque.enviaProduto(p.getProduto(), p.getEnderecoDeEntrega(), p.getPedidoID()); this.financeiro.fatura(p.getCliente(), p.getProduto(), p.getPedidoID()); this.posVenda.agendaContato(p.getCliente(), p.getProduto()); }}
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 105
public class PedidoFacade {
private Estoque estoque; private Financeiro financeiro; private PosVenda posVenda;
public PedidoFacade(Estoque estoque, Financeiro financeiro, PosVenda posVenda) {
this.estoque = estoque; this.financeiro = financeiro; this.posVenda = posVenda;
} public void registraPedido(Pedido p) {
this.estoque.enviaProduto(p.getProduto(), p.getEnderecoDeEntrega(), p.getPedidoID()); this.financeiro.fatura(p.getCliente(), p.getProduto(), p.getPedidoID()); this.posVenda.agendaContato(p.getCliente(), p.getProduto()); }}
O método registraPedido encapsula o acesso aos módulos de estoque, financeiro e pós venda.
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 106
Defina uma classe para testar o PedidoFacade
public class TestaPedidoFacade {
public static void main(String[] args) {
Estoque estoque = new Estoque(); Financeiro financeiro = new Financeiro(); PosVenda posVenda = new PosVenda();
PedidoFacade facade = new PedidoFacade(estoque , financeiro , posVenda);
Pedido pedido = new Pedido("Smartphone", "Jose da Silva","Av. Nicomedes Alves dos Santos, 4545 - Gavea, Uberlândia - MG", 1234);
facade.registraPedido(pedido); }}
Facade
UML e Padrões de Projeto Centro Universitário do Triângulo 107
public class TestaPedidoFacade {
public static void main(String[] args) {
Estoque estoque = new Estoque(); Financeiro financeiro = new Financeiro(); PosVenda posVenda = new PosVenda();
PedidoFacade facade = new PedidoFacade(estoque , financeiro , posVenda);
Pedido pedido = new Pedido("Smartphone", "Jose da Silva","Av. Nicomedes Alves dos Santos, 4545 - Gavea, Uberlândia - MG", 1234);
facade.registraPedido(pedido); }}
O método da fachada é acionado para registrar o pedido.
Quem faz o quê?
UML e Padrões de Projeto Centro Universitário do Triângulo 108
• Adapter • Decorator • Facade
Quem faz o quê?
UML e Padrões de Projeto Centro Universitário do Triângulo 109
• Adapter Converte uma interface para outra.
• Decorator • Facade
Quem faz o quê?
UML e Padrões de Projeto Centro Universitário do Triângulo 110
• Adapter Converte uma interface para outra.
• Decorator Não muda a interface, só acrescenta responsabilidades.
• Facade
Quem faz o quê?
UML e Padrões de Projeto Centro Universitário do Triângulo 111
• Adapter Converte uma interface para outra.
• Decorator Não muda a interface, só acrescenta responsabilidades.
• Facade Simplifica uma interface.
Bibliografia • Gamma, Erich; Richard Helm, Ralph Johnson, John M. Vlissides . Design paierns: elements of reusable object-‐oriented sojware. Reading: Addison-‐Wesley, 1995.
• Erich Freeman, Elizabeth Freeman. HeadFirst – Design Paierns. O ́REILLY 2004.
• METSKER, J. Design Paierns Java Workbook. EUA: Addison-‐Wesley 2002.
• K19 Treinamentos, “Design Paierns em Java”.
UML e Padrões de Projeto Centro Universitário do Triângulo 112