aula 06 - uml e padrões de projeto

112
Especialização em Desenvolvimento Java UML e Padrões de Projetos AULA 06 – PADRÕES ESTRUTURAIS Prof. Vinícius de Paula [email protected]

Upload: vinicius-de-paula

Post on 15-Apr-2017

499 views

Category:

Education


0 download

TRANSCRIPT

Page 1: 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]  

Page 2: Aula 06 - UML e Padrões de Projeto

Padrões  Estruturais  

Page 3: Aula 06 - UML e Padrões de Projeto

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

Page 4: Aula 06 - UML e Padrões de Projeto

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

Page 5: Aula 06 - UML e Padrões de Projeto

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

Page 6: Aula 06 - UML e Padrões de Projeto

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

Page 7: Aula 06 - UML e Padrões de Projeto

Adapter  

Page 8: Aula 06 - UML e Padrões de Projeto

Adapter  ObjeSvo  segundo  o  GoF:  

 

UML e Padrões de Projeto Centro Universitário do Triângulo 8

Page 9: Aula 06 - UML e Padrões de Projeto

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

Page 10: Aula 06 - UML e Padrões de Projeto

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

Page 11: Aula 06 - UML e Padrões de Projeto

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.

Page 12: Aula 06 - UML e Padrões de Projeto

Adapter  

UML e Padrões de Projeto Centro Universitário do Triângulo 12

Estrutura do Adapter, segundo GoF (pág. 159)

Page 13: Aula 06 - UML e Padrões de Projeto

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  

Page 14: Aula 06 - UML e Padrões de Projeto

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  

Page 15: Aula 06 - UML e Padrões de Projeto

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  

Page 16: Aula 06 - UML e Padrões de Projeto

Adapter  

UML e Padrões de Projeto Centro Universitário do Triângulo 16

Sistema existente Classe do novo fornecedor

Page 17: Aula 06 - UML e Padrões de Projeto

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.

Page 18: Aula 06 - UML e Padrões de Projeto

Adapter  

UML e Padrões de Projeto Centro Universitário do Triângulo 18

Sistema existente Classe do novo fornecedor

Adaptador

Page 19: Aula 06 - UML e Padrões de Projeto

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.

Page 20: Aula 06 - UML e Padrões de Projeto

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.

Page 21: Aula 06 - UML e Padrões de Projeto

Adapter  

UML e Padrões de Projeto Centro Universitário do Triângulo 21

Sistema existente

Classe do novo

fornecedor

Adaptador

Page 22: Aula 06 - UML e Padrões de Projeto

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

Page 23: Aula 06 - UML e Padrões de Projeto

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

Page 24: Aula 06 - UML e Padrões de Projeto

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

Page 25: Aula 06 - UML e Padrões de Projeto

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

Page 26: Aula 06 - UML e Padrões de Projeto

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

Page 27: Aula 06 - UML e Padrões de Projeto

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

Page 28: Aula 06 - UML e Padrões de Projeto

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

Page 29: Aula 06 - UML e Padrões de Projeto

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

Page 30: Aula 06 - UML e Padrões de Projeto

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.

Page 31: Aula 06 - UML e Padrões de Projeto

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);

Page 32: Aula 06 - UML e Padrões de Projeto

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  

Page 33: Aula 06 - UML e Padrões de Projeto

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);

Page 34: Aula 06 - UML e Padrões de Projeto

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  

Page 35: Aula 06 - UML e Padrões de Projeto

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

Page 36: Aula 06 - UML e Padrões de Projeto

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); }}

Page 37: Aula 06 - UML e Padrões de Projeto

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

Page 38: Aula 06 - UML e Padrões de Projeto

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

Page 39: Aula 06 - UML e Padrões de Projeto

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

Page 40: Aula 06 - UML e Padrões de Projeto

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);

Page 41: Aula 06 - UML e Padrões de Projeto

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.

Page 42: Aula 06 - UML e Padrões de Projeto

Adapter  

UML e Padrões de Projeto Centro Universitário do Triângulo 42

Modelo  de  Classes  do  Cenário  Prá=co  

Page 43: Aula 06 - UML e Padrões de Projeto

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

Page 44: Aula 06 - UML e Padrões de Projeto

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

Page 45: Aula 06 - UML e Padrões de Projeto

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

Page 46: Aula 06 - UML e Padrões de Projeto

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

Page 47: Aula 06 - UML e Padrões de Projeto

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

Page 48: Aula 06 - UML e Padrões de Projeto

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

Page 49: Aula 06 - UML e Padrões de Projeto

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

Page 50: Aula 06 - UML e Padrões de Projeto

Decorator  

Page 51: Aula 06 - UML e Padrões de Projeto

Decorator  ObjeSvo  segundo  o  GoF:  

 

UML e Padrões de Projeto Centro Universitário do Triângulo 51

Page 52: Aula 06 - UML e Padrões de Projeto

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

Page 53: Aula 06 - UML e Padrões de Projeto

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

Page 54: Aula 06 - UML e Padrões de Projeto

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.

Page 55: Aula 06 - UML e Padrões de Projeto

Decorator  

UML e Padrões de Projeto Centro Universitário do Triângulo 55

Estrutura do Decorator, segundo GoF (pág. 199)

Page 56: Aula 06 - UML e Padrões de Projeto

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  

Page 57: Aula 06 - UML e Padrões de Projeto

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  

Page 58: Aula 06 - UML e Padrões de Projeto

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  

Page 59: Aula 06 - UML e Padrões de Projeto

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  

Page 60: Aula 06 - UML e Padrões de Projeto

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

Page 61: Aula 06 - UML e Padrões de Projeto

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);}

Page 62: Aula 06 - UML e Padrões de Projeto

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); } }

Page 63: Aula 06 - UML e Padrões de Projeto

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

Page 64: Aula 06 - UML e Padrões de Projeto

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

Page 65: Aula 06 - UML e Padrões de Projeto

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).

Page 66: Aula 06 - UML e Padrões de Projeto

Decorator  Alguns  pontos  para  se  pensar:  

UML e Padrões de Projeto Centro Universitário do Triângulo 66

Page 67: Aula 06 - UML e Padrões de Projeto

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

Page 68: Aula 06 - UML e Padrões de Projeto

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

Page 69: Aula 06 - UML e Padrões de Projeto

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

Page 70: Aula 06 - UML e Padrões de Projeto

Decorator  

UML e Padrões de Projeto Centro Universitário do Triângulo 70

Modelo  de  Classes  do  Cenário  Prá=co  

Page 71: Aula 06 - UML e Padrões de Projeto

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

Page 72: Aula 06 - UML e Padrões de Projeto

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; }}

Page 73: Aula 06 - UML e Padrões de Projeto

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...

Page 74: Aula 06 - UML e Padrões de Projeto

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()); }}

Page 75: Aula 06 - UML e Padrões de Projeto

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); }}

Page 76: Aula 06 - UML e Padrões de Projeto

Decorator  Consequências  de  se  usar  decoradores:  

 

UML e Padrões de Projeto Centro Universitário do Triângulo 76

Page 77: Aula 06 - UML e Padrões de Projeto

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

Page 78: Aula 06 - UML e Padrões de Projeto

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

Page 79: Aula 06 - UML e Padrões de Projeto

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

Page 80: Aula 06 - UML e Padrões de Projeto

Facade  

Page 81: Aula 06 - UML e Padrões de Projeto

Facade  ObjeSvo  segundo  o  GoF:  

 

UML e Padrões de Projeto Centro Universitário do Triângulo 81

Page 82: Aula 06 - UML e Padrões de Projeto

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

Page 83: Aula 06 - UML e Padrões de Projeto

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

Page 84: Aula 06 - UML e Padrões de Projeto

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)

Page 85: Aula 06 - UML e Padrões de Projeto

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.

Page 86: Aula 06 - UML e Padrões de Projeto

Facade  

UML e Padrões de Projeto Centro Universitário do Triângulo 86

Estrutura do Facade, segundo GoF (pág. 210)

Page 87: Aula 06 - UML e Padrões de Projeto

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  

Page 88: Aula 06 - UML e Padrões de Projeto

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  

Page 89: Aula 06 - UML e Padrões de Projeto

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

Page 90: Aula 06 - UML e Padrões de Projeto

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

Page 91: Aula 06 - UML e Padrões de Projeto

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

Page 92: Aula 06 - UML e Padrões de Projeto

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

Page 93: Aula 06 - UML e Padrões de Projeto

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

Page 94: Aula 06 - UML e Padrões de Projeto

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());

Page 95: Aula 06 - UML e Padrões de Projeto

Facade  Cenário  Prá=co  

Como  podemos  simplificar  essa  lógica?  

UML e Padrões de Projeto Centro Universitário do Triângulo 95

Page 96: Aula 06 - UML e Padrões de Projeto

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

Page 97: Aula 06 - UML e Padrões de Projeto

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);

Page 98: Aula 06 - UML e Padrões de Projeto

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

Page 99: Aula 06 - UML e Padrões de Projeto

Facade  

UML e Padrões de Projeto Centro Universitário do Triângulo 99

Modelo  de  Classes  do  Cenário  Prá=co  

Page 100: Aula 06 - UML e Padrões de Projeto

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...

Page 101: Aula 06 - UML e Padrões de Projeto

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); }}

Page 102: Aula 06 - UML e Padrões de Projeto

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); }}

Page 103: Aula 06 - UML e Padrões de Projeto

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);

}}

Page 104: Aula 06 - UML e Padrões de Projeto

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()); }}

Page 105: Aula 06 - UML e Padrões de Projeto

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.

Page 106: Aula 06 - UML e Padrões de Projeto

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); }}

Page 107: Aula 06 - UML e Padrões de Projeto

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.

Page 108: Aula 06 - UML e Padrões de Projeto

Quem  faz  o  quê?    

UML e Padrões de Projeto Centro Universitário do Triângulo 108

•  Adapter  •  Decorator  •  Facade  

Page 109: Aula 06 - UML e Padrões de Projeto

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  

Page 110: Aula 06 - UML e Padrões de Projeto

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    

Page 111: Aula 06 - UML e Padrões de Projeto

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.  

 

Page 112: Aula 06 - UML e Padrões de Projeto

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