SlideShare une entreprise Scribd logo
1  sur  50
Télécharger pour lire hors ligne
DECORATOR
QUESTÃO
  O que é delegação?
  Como podemos usar a composição para
implementar delegação?
O padrão Decorator
O padrão Decorator
O padrão Decorator
O padrão Decorator
Estudo de caso
JavaCoffe
Podem ser adicionados
Ingredientes Extras
  Chocolate
  Soja
  Leite
  Creme
  Cada classe precisaria alterar o método custo para
adiciona o valor dos ingredientes
Ops...
Número muito grande de subclasses
Alternativa
  Adicionar variáveis de instâncias booleanas na
superclasse para monitorar os ingredientes
  Classe: Bebida
  Variáveis de Instância
Bebida
+ Variáveis de instância
Variáveis de instância
booleanas
A classe Bebida
calcula o valor dos
Ingredientes existentes
na bebida
As subclasses
extendem a
funcionalidade para
adicionar o preço da bebida
Exercício
  Codifique os métodos custo() das seguinte
classes:
public class Bebida {
public double custo() {
}
}
public class Expresso
extends Bebida {
public Expresso() {
descricao =“Expresso”;
}
public double custo() {
}
}
Cafés
MisturaDaCasa 0,89
Expresso 1,99
Descafeinado 1,49
Ingredientes
Leite 0,10
Soja 0,15
Chocolate 0,20
Creme 0,15
Quais os problemas?
  Mudanças de preços
  Novos ingredientes
  Novas Bebidas
  E se quiser 2x chocolate?
Quais os problemas?
  Herança nem sempre leva a designs flexíveis e
fáceis de manter
  Quais outros meios de “herdar” comportamento?
  Composição e Delegação
  Compondo objetos de forma dinâmica é possível
adicionar novas funcionalidades através da
criação de um código novo, ao invés de alterar
o já existente.
Princípio de Design
OPEN-CLOSED
  As classes devem estar abertas para
extensão, mas fechadas para modificação.
  Permite que a classe seja facilmente extendida
sem alterar seu comportamento
 Adicione novos comportamentos
através da extensão
 Não altere o código existente
Qual a idéia?
  O design inicial de bebidas não funciona
  Começaremos com uma bebida
  E iremos “decorá-las” com ingredientes em tempo de
execução
  Passos:
Pegar um objeto MisturaDaCasa
Decorá-lo com um objeto Chocolate
Decorá-lo com um objeto Leite
Chamar o método custo e através da delegação calcular o
valor total da bebida
1. Pegar o objeto MisturaDaCasa
• Herda de Bebida
• Seu método custo() calcula
o valor do drinque
2. Criamos um objeto Chocolate
e inserimos o MisturaDaCasa nele
Objeto Decorator
Mesmo tipo do objeto que envolve
3. O cliente também quer Leite
Criamos o leite e colocamos tudo nele
Objeto Decorator
Mesmo tipo do objeto que envolve
4. Calculo total da bebida
O,99
+ O,20
+ O,101,29
O que temos até então
  Decorators têm o mesmo supertipo do
objeto que envolvem (do objeto que
“decoram”)
  É possível envolver um objeto com mais de
um Decorator
  Como o Decorator tem o mesmo tipo do
objeto envolvido, podemos passar um objeto
“decorado” no lugar do objeto original
O que temos até então
  O Decorator adiciona seu próprio
comportamento antes e/ou depois de
delegar para o objeto que ele decora o resto
do trabalho
  Objetos podem ser decorados a qualquer
momento, então podemos decorar os
objetos de forma dinâmica em tempo de
execução com quantos decorators
desejarmos
Terceiro Padrão
DECORATOR
O Padrão Decorator agrega
responsabilidades adicionais a um objeto
dinamicamente. Os decorators (decoradores)
fornecem uma alternativa flexível ao uso de
subclasse para extensão de funcionalidades.
Diagrama
de classes
O Padrão Decorator
agrega responsabilidades
adicionais a um objeto
dinamicamente. Os
decorators (decoradores)
fornecem uma alternativa
flexível ao uso de
subclasse para extensão
de funcionalidades.
Como adaptar o padrão
para as bebidas?
Cafés
MisturaDaCasa 0,89
Expresso 1,99
Descafeinado 1,49
Ingredientes
Leite 0,10
Soja 0,15
Chocolate 0,20
Creme 0,15
Diagrama de classes para Bebidas
com Decorator
Exercício
  Como seria representação gráfica do pedido
de um café Expresso com 2 doses de
chocolate e 1 dose de soja?
Codificando a Bebida
  Classe Abstrata
Bebida.java
public abstract class Bebida {
String descricao = "Bebida Desconhecida";
/**
* @return the descricao
*/
public String getDescricao() {
return descricao;
}
public abstract double custo();
}
Codificando
IngredienteDecorator
IngredienteDecorator.java
public abstract class IngredienteDecorator
extends Bebida
{
Bebida bebida;
public abstract String getDescricao();
}
Codificando o Expresso
Expresso.java
public class Expresso extends Bebida {
public Expresso() {
descricao = "Café Expresso";
}
public double custo() {
return 1.99;
}
}
Codificano MisturaDaCasa
MisturaDaCasa.java
public class MisturaDaCasa extends Bebida {
public MisturaDaCasa() {
descricao = "Café Mistura da Casa";
}
public double custo() {
return 0.99;
}
}
Mais Componentes
  Descafeinado.java
  Capuccino.java
Codificando Chocolate.java
Chocolate.java
public class Chocolate extends IngredienteDecorator {
public Chocolate(Bebida bebida) {
this.bebida = bebida;
}
public String getDescricao() {
return bebida.getDescricao() + ", com Chocolate";
}
public double custo() {
return 0.5 + bebida.custo();
}
}
Codificando Leite.java
Leite.java
public class Leite extends IngredienteDecorator {
Bebida bebida;
public Leite(Bebida bebida) {
this.bebida = bebida;
}
public String getDescricao() {
return bebida.getDescricao() + ", com Leite";
}
public double custo() {
return 0.5 + bebida.custo();
}
}
Mais Decorators
  Creme.java
  Soja.java
Como codificar
a Cafeteria JavaCoffe?
  A Classe de testes
JavaCoffe.java
public class JavaCoffe {
public static void main(String[] args) {
Bebida bebida = new Expresso();
System.out.println(bebida.getDescricao()
+ " R$ " + bebida.custo());
Bebida bebida2 = new MisturaDaCasa();
bebida2 = new Chocolate(bebida2);
bebida2 = new Chocolate(bebida2);
bebida2 = new Leite(bebida2);
System.out.println(bebida2.getDescricao()
+ " R$ " + bebida2.custo());
Bebida bebida3 = new Expresso();
bebida3 = new Creme(bebida3);
bebida3 = new Chocolate(bebida3);
bebida3 = new Leite(bebida3);
System.out.println(bebida3.getDescricao()
+ " R$ " + bebida3.custo());
}
}
  Herança nem sempre produz designs flexíveis
  O design deveria permitir adição de comportamento sem afetar o
que já existe
  Composição e delegação podem sempre ser usadas para adicionar
novos comportamentos em tempo de execução
  O padrão Decorator fornece uma alternativa ao uso de subclasses
para adicionar comportamento
  O padrão Decorator é constituído de um conjunto de classes
Decorator que são usadas para envolver componentes concretos
  As classes Decorator são do mesmo tipo da classes que envolvem
  Decorators mudam o comportamento de seus componentes
adicionando novas funcionalidades
  Você pode envolver componentes a quantidade de Decorators que
desejar
  O padrão Decorator pode resultar em muitos pequenos objetos, e o
uso exagerado pode se tornar complexo
Decorator
Diagrama de Classes
Aplicabilidade
  Use o padrão Decorator quando:
  Acrescentar responsabilidades a objetos individuais
de forma dinâmica e transparente (sem afetar
outros objetos)
  Para responsabilidades que podem ser removidas
  Quando a extensão através de subclasses não é
prática
Participantes
  Component
  Define uma interface para objetos que podem ter
responsabilidades acrescentadas aos mesmos
dinamicamente
  ConcreteComponent
  Define um objeto para o qual responsabilidades adicionais
podem ser atribuídas
  Decorator
  Mantém uma referência para um objeto Component e
define uma interface que segue a interface de Component
  ConcreteDecorator
  Acrescenta responsabilidades ao componente
Colaborações
  Decorator repassa solicitações para o seu
objeto Component
  Opcionalmente, pode o Decorator pode
executar operações adicionais antes e depois
de repassar a solicitação
Consequências
  Maior flexibilidade do que a herança estática
  Responsabilidades removidas e acrescentadas em tempo
de execução através de associação e dissociação
  Enquanto o mecanismo da herança cria uma nova
subclasses para cada funcionalidade
  Decorators permitem que propriedades sejam adicionadas
2 ou mais vezes
  Evita classes sobrecarregadas de características na
parte superior da hierarquia
  Use quando for necessário
Consequências
  Grande quantidade de pequenos objetos
  Sistemas compostos por uma grande quantidade
de objetos parecidos
  Objetos diferem diferem na maneira que são
interconectados
  Sistemas fáceis de customizar por quem os
compreende
  Difíceis de aprender e depurar

Contenu connexe

Tendances

Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]
Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]
Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]Ministério Público da Paraíba
 
Banco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bdBanco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bdM Serafim
 
Introdução a Gerência de Redes
Introdução a Gerência de RedesIntrodução a Gerência de Redes
Introdução a Gerência de RedesFrederico Madeira
 
VLAN - Conceitos Básicos
VLAN - Conceitos BásicosVLAN - Conceitos Básicos
VLAN - Conceitos BásicosAnderson Zardo
 
compressao de dados
compressao de dadoscompressao de dados
compressao de dadosmidleofmidle
 
Aula 2 arquitecturas de sgbd, utilizadores, perfis
Aula 2   arquitecturas de sgbd, utilizadores, perfisAula 2   arquitecturas de sgbd, utilizadores, perfis
Aula 2 arquitecturas de sgbd, utilizadores, perfisHélio Martins
 
Topologia fisica barramento
Topologia fisica barramentoTopologia fisica barramento
Topologia fisica barramento2lindos
 
Curs 3 definirea cerinţelor sistemului
Curs 3 definirea cerinţelor sistemuluiCurs 3 definirea cerinţelor sistemului
Curs 3 definirea cerinţelor sistemuluiiulia_ion
 
Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Evandro Júnior
 
Visibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLVisibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLufpb
 
Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)Armando Daniel
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)Armando Daniel
 
Mer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoMer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoRademaker Siena
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a pooSedu
 
Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos GrafosBianca Dantas
 
Memoria virtual
Memoria virtualMemoria virtual
Memoria virtualMauro Melo
 

Tendances (20)

Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]
Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]
Tecnologias Atuais de Redes - Aula 4 - Comutação [Apostila]
 
Banco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bdBanco de dados distribuídos mnt bd
Banco de dados distribuídos mnt bd
 
Diagramas de pacotes
Diagramas de pacotesDiagramas de pacotes
Diagramas de pacotes
 
Introdução a Gerência de Redes
Introdução a Gerência de RedesIntrodução a Gerência de Redes
Introdução a Gerência de Redes
 
VLAN - Conceitos Básicos
VLAN - Conceitos BásicosVLAN - Conceitos Básicos
VLAN - Conceitos Básicos
 
compressao de dados
compressao de dadoscompressao de dados
compressao de dados
 
Aula 2 arquitecturas de sgbd, utilizadores, perfis
Aula 2   arquitecturas de sgbd, utilizadores, perfisAula 2   arquitecturas de sgbd, utilizadores, perfis
Aula 2 arquitecturas de sgbd, utilizadores, perfis
 
Topologia fisica barramento
Topologia fisica barramentoTopologia fisica barramento
Topologia fisica barramento
 
Curs 3 definirea cerinţelor sistemului
Curs 3 definirea cerinţelor sistemuluiCurs 3 definirea cerinţelor sistemului
Curs 3 definirea cerinţelor sistemului
 
Routing
RoutingRouting
Routing
 
Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014Comandos ms-dos - Atualizado 29/10/2014
Comandos ms-dos - Atualizado 29/10/2014
 
Visibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UMLVisibilidade e Diagrama de Classe de Projeto na UML
Visibilidade e Diagrama de Classe de Projeto na UML
 
Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)
 
Java orientação a objetos (associacao, composicao, agregacao)
Java   orientação a objetos (associacao, composicao, agregacao)Java   orientação a objetos (associacao, composicao, agregacao)
Java orientação a objetos (associacao, composicao, agregacao)
 
Mer - Modelo Entidade Relacionamento
Mer - Modelo Entidade RelacionamentoMer - Modelo Entidade Relacionamento
Mer - Modelo Entidade Relacionamento
 
Tipos de Servidores
Tipos de ServidoresTipos de Servidores
Tipos de Servidores
 
Banco De Dados
Banco De DadosBanco De Dados
Banco De Dados
 
Introdução a poo
Introdução a pooIntrodução a poo
Introdução a poo
 
Introdução à Teoria dos Grafos
Introdução à Teoria dos GrafosIntrodução à Teoria dos Grafos
Introdução à Teoria dos Grafos
 
Memoria virtual
Memoria virtualMemoria virtual
Memoria virtual
 

En vedette (20)

Padrão de Projeto - Decorator
Padrão de Projeto - DecoratorPadrão de Projeto - Decorator
Padrão de Projeto - Decorator
 
Prototype
PrototypePrototype
Prototype
 
Decorator Design Pattern
Decorator Design PatternDecorator Design Pattern
Decorator Design Pattern
 
Html - Aula 3
Html - Aula 3Html - Aula 3
Html - Aula 3
 
Introducao - Engenharia de Software
Introducao - Engenharia de SoftwareIntroducao - Engenharia de Software
Introducao - Engenharia de Software
 
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internetG gpcwmlguth 02.009.030.004-video_dvr_-_internet
G gpcwmlguth 02.009.030.004-video_dvr_-_internet
 
# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1# Dvr stand alone maxstand 2 em 1
# Dvr stand alone maxstand 2 em 1
 
Evolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de SoftwareEvolução de software 1 - Engenharia de Software
Evolução de software 1 - Engenharia de Software
 
Apostila `profissional cftv
Apostila `profissional cftvApostila `profissional cftv
Apostila `profissional cftv
 
Guia do cftv básico
Guia do cftv   básicoGuia do cftv   básico
Guia do cftv básico
 
Padrões de Projeto
Padrões de ProjetoPadrões de Projeto
Padrões de Projeto
 
Fábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de ProjetoFábrica Simples - Padrões de Projeto
Fábrica Simples - Padrões de Projeto
 
Desenvolvimento agil de_software
Desenvolvimento agil de_softwareDesenvolvimento agil de_software
Desenvolvimento agil de_software
 
Html Aula 1 Parte 1
Html  Aula 1 Parte 1Html  Aula 1 Parte 1
Html Aula 1 Parte 1
 
Html - Aula 4
Html - Aula 4Html - Aula 4
Html - Aula 4
 
Padrão Adapter
Padrão AdapterPadrão Adapter
Padrão Adapter
 
RSpec com doubles
RSpec com doublesRSpec com doubles
RSpec com doubles
 
TDD - Prática com RSpec
TDD - Prática com RSpecTDD - Prática com RSpec
TDD - Prática com RSpec
 
Engenharia de Requisitos
Engenharia de RequisitosEngenharia de Requisitos
Engenharia de Requisitos
 
Academia java intensivo
Academia java intensivoAcademia java intensivo
Academia java intensivo
 

Similaire à Decorator - Padrões de projeto

Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojofabioginzel
 
Slide 03 conectando no banco de dados, criação de helpers
Slide 03   conectando no banco de dados, criação de helpersSlide 03   conectando no banco de dados, criação de helpers
Slide 03 conectando no banco de dados, criação de helpersRaniere de Lima
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Walney Negreiros
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - IFabio Moura Pereira
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Daniel Makiyama
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcJeison Barros
 
Módulo 08 Workflows
Módulo 08 WorkflowsMódulo 08 Workflows
Módulo 08 WorkflowsRodrigo Prado
 
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Pedro Fernandes Vieira
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dadosRaul Dias
 
Slide 06 adicionando produtos e mostrando produto selecionado
Slide 06    adicionando produtos e mostrando produto selecionadoSlide 06    adicionando produtos e mostrando produto selecionado
Slide 06 adicionando produtos e mostrando produto selecionadoRaniere de Lima
 
Desenvolvimento Delphi
Desenvolvimento DelphiDesenvolvimento Delphi
Desenvolvimento Delphihildebertomelo
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objetoElaine Naomi
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...tdc-globalcode
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Rafael Sales Pavarina
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 

Similaire à Decorator - Padrões de projeto (20)

Vb
VbVb
Vb
 
Programação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com DojoProgramação Web com Zend Framework e Ajax com Dojo
Programação Web com Zend Framework e Ajax com Dojo
 
Slide 03 conectando no banco de dados, criação de helpers
Slide 03   conectando no banco de dados, criação de helpersSlide 03   conectando no banco de dados, criação de helpers
Slide 03 conectando no banco de dados, criação de helpers
 
Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01Padroes de Projetos e aplicações- parte 01
Padroes de Projetos e aplicações- parte 01
 
05 - Sincronização de Threads - I
05 - Sincronização de Threads - I05 - Sincronização de Threads - I
05 - Sincronização de Threads - I
 
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
Aprendendo Na Prática: Aplicativos Web Com Asp.Net MVC em C# e Entity Framewo...
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Conectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbcConectando seu banco de dados usando jdbc
Conectando seu banco de dados usando jdbc
 
Refactoring
RefactoringRefactoring
Refactoring
 
Módulo 08 Workflows
Módulo 08 WorkflowsMódulo 08 Workflows
Módulo 08 Workflows
 
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
Como desenvolver uma aplicação Web com django 2.2.13 (Parte 2 de 2)
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dados
 
Slide 06 adicionando produtos e mostrando produto selecionado
Slide 06    adicionando produtos e mostrando produto selecionadoSlide 06    adicionando produtos e mostrando produto selecionado
Slide 06 adicionando produtos e mostrando produto selecionado
 
Desenvolvimento Delphi
Desenvolvimento DelphiDesenvolvimento Delphi
Desenvolvimento Delphi
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Design de aplicações orientadas a objeto
Design de aplicações orientadas a objetoDesign de aplicações orientadas a objeto
Design de aplicações orientadas a objeto
 
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
TDC2018SP | Trilha Ruby - Design de aplicacoes orientadas a objeto: uma visao...
 
Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018Workshop Django Framework - 30/10/2018
Workshop Django Framework - 30/10/2018
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Design Patterns - Adapter e Decorator
Design Patterns - Adapter e DecoratorDesign Patterns - Adapter e Decorator
Design Patterns - Adapter e Decorator
 

Plus de Eduardo Mendes

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosEduardo Mendes
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - FundamentosEduardo Mendes
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de ProjetoEduardo Mendes
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTMLEduardo Mendes
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEduardo Mendes
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails Eduardo Mendes
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Eduardo Mendes
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantesEduardo Mendes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantesEduardo Mendes
 

Plus de Eduardo Mendes (20)

JavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a ObjetosJavaScript - Introdução com Orientação a Objetos
JavaScript - Introdução com Orientação a Objetos
 
AngularJS - Rotas
AngularJS - RotasAngularJS - Rotas
AngularJS - Rotas
 
Angular JS - Fundamentos
Angular JS - FundamentosAngular JS - Fundamentos
Angular JS - Fundamentos
 
Singleton - Padrão de Projeto
Singleton - Padrão de ProjetoSingleton - Padrão de Projeto
Singleton - Padrão de Projeto
 
Layout Fluido
Layout FluidoLayout Fluido
Layout Fluido
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
Introdução à Internet, Http e HTML
Introdução à Internet, Http e HTMLIntrodução à Internet, Http e HTML
Introdução à Internet, Http e HTML
 
ExtJS-4
ExtJS-4ExtJS-4
ExtJS-4
 
Jquery 2
Jquery 2Jquery 2
Jquery 2
 
Jquery
JqueryJquery
Jquery
 
Estimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de SoftwareEstimativas de Esforço - Engenharia de Software
Estimativas de Esforço - Engenharia de Software
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 
Validações no Ruby on Rails
Validações no Ruby on Rails Validações no Ruby on Rails
Validações no Ruby on Rails
 
Padrão Iterator
Padrão IteratorPadrão Iterator
Padrão Iterator
 
Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)Padroes Template-Method (Método Gabarito)
Padroes Template-Method (Método Gabarito)
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 
Padrão Fachada
Padrão FachadaPadrão Fachada
Padrão Fachada
 
Web Design Responsivo
Web Design ResponsivoWeb Design Responsivo
Web Design Responsivo
 
PHP básico para iniciantes
PHP básico para iniciantesPHP básico para iniciantes
PHP básico para iniciantes
 
PHP e MySQL para iniciantes
PHP e MySQL para iniciantesPHP e MySQL para iniciantes
PHP e MySQL para iniciantes
 

Decorator - Padrões de projeto

  • 2. QUESTÃO   O que é delegação?   Como podemos usar a composição para implementar delegação?
  • 8. Podem ser adicionados Ingredientes Extras   Chocolate   Soja   Leite   Creme   Cada classe precisaria alterar o método custo para adiciona o valor dos ingredientes
  • 10. Alternativa   Adicionar variáveis de instâncias booleanas na superclasse para monitorar os ingredientes   Classe: Bebida   Variáveis de Instância
  • 11. Bebida + Variáveis de instância Variáveis de instância booleanas A classe Bebida calcula o valor dos Ingredientes existentes na bebida As subclasses extendem a funcionalidade para adicionar o preço da bebida
  • 12. Exercício   Codifique os métodos custo() das seguinte classes: public class Bebida { public double custo() { } } public class Expresso extends Bebida { public Expresso() { descricao =“Expresso”; } public double custo() { } } Cafés MisturaDaCasa 0,89 Expresso 1,99 Descafeinado 1,49 Ingredientes Leite 0,10 Soja 0,15 Chocolate 0,20 Creme 0,15
  • 13. Quais os problemas?   Mudanças de preços   Novos ingredientes   Novas Bebidas   E se quiser 2x chocolate?
  • 14. Quais os problemas?   Herança nem sempre leva a designs flexíveis e fáceis de manter   Quais outros meios de “herdar” comportamento?   Composição e Delegação   Compondo objetos de forma dinâmica é possível adicionar novas funcionalidades através da criação de um código novo, ao invés de alterar o já existente.
  • 15. Princípio de Design OPEN-CLOSED   As classes devem estar abertas para extensão, mas fechadas para modificação.   Permite que a classe seja facilmente extendida sem alterar seu comportamento  Adicione novos comportamentos através da extensão  Não altere o código existente
  • 16. Qual a idéia?   O design inicial de bebidas não funciona   Começaremos com uma bebida   E iremos “decorá-las” com ingredientes em tempo de execução   Passos: Pegar um objeto MisturaDaCasa Decorá-lo com um objeto Chocolate Decorá-lo com um objeto Leite Chamar o método custo e através da delegação calcular o valor total da bebida
  • 17. 1. Pegar o objeto MisturaDaCasa • Herda de Bebida • Seu método custo() calcula o valor do drinque
  • 18. 2. Criamos um objeto Chocolate e inserimos o MisturaDaCasa nele Objeto Decorator Mesmo tipo do objeto que envolve
  • 19. 3. O cliente também quer Leite Criamos o leite e colocamos tudo nele Objeto Decorator Mesmo tipo do objeto que envolve
  • 20. 4. Calculo total da bebida O,99 + O,20 + O,101,29
  • 21. O que temos até então   Decorators têm o mesmo supertipo do objeto que envolvem (do objeto que “decoram”)   É possível envolver um objeto com mais de um Decorator   Como o Decorator tem o mesmo tipo do objeto envolvido, podemos passar um objeto “decorado” no lugar do objeto original
  • 22. O que temos até então   O Decorator adiciona seu próprio comportamento antes e/ou depois de delegar para o objeto que ele decora o resto do trabalho   Objetos podem ser decorados a qualquer momento, então podemos decorar os objetos de forma dinâmica em tempo de execução com quantos decorators desejarmos
  • 23. Terceiro Padrão DECORATOR O Padrão Decorator agrega responsabilidades adicionais a um objeto dinamicamente. Os decorators (decoradores) fornecem uma alternativa flexível ao uso de subclasse para extensão de funcionalidades.
  • 24. Diagrama de classes O Padrão Decorator agrega responsabilidades adicionais a um objeto dinamicamente. Os decorators (decoradores) fornecem uma alternativa flexível ao uso de subclasse para extensão de funcionalidades.
  • 25. Como adaptar o padrão para as bebidas? Cafés MisturaDaCasa 0,89 Expresso 1,99 Descafeinado 1,49 Ingredientes Leite 0,10 Soja 0,15 Chocolate 0,20 Creme 0,15
  • 26. Diagrama de classes para Bebidas com Decorator
  • 27. Exercício   Como seria representação gráfica do pedido de um café Expresso com 2 doses de chocolate e 1 dose de soja?
  • 28. Codificando a Bebida   Classe Abstrata
  • 29. Bebida.java public abstract class Bebida { String descricao = "Bebida Desconhecida"; /** * @return the descricao */ public String getDescricao() { return descricao; } public abstract double custo(); }
  • 31. IngredienteDecorator.java public abstract class IngredienteDecorator extends Bebida { Bebida bebida; public abstract String getDescricao(); }
  • 33. Expresso.java public class Expresso extends Bebida { public Expresso() { descricao = "Café Expresso"; } public double custo() { return 1.99; } }
  • 35. MisturaDaCasa.java public class MisturaDaCasa extends Bebida { public MisturaDaCasa() { descricao = "Café Mistura da Casa"; } public double custo() { return 0.99; } }
  • 38. Chocolate.java public class Chocolate extends IngredienteDecorator { public Chocolate(Bebida bebida) { this.bebida = bebida; } public String getDescricao() { return bebida.getDescricao() + ", com Chocolate"; } public double custo() { return 0.5 + bebida.custo(); } }
  • 40. Leite.java public class Leite extends IngredienteDecorator { Bebida bebida; public Leite(Bebida bebida) { this.bebida = bebida; } public String getDescricao() { return bebida.getDescricao() + ", com Leite"; } public double custo() { return 0.5 + bebida.custo(); } }
  • 42. Como codificar a Cafeteria JavaCoffe?   A Classe de testes
  • 43. JavaCoffe.java public class JavaCoffe { public static void main(String[] args) { Bebida bebida = new Expresso(); System.out.println(bebida.getDescricao() + " R$ " + bebida.custo()); Bebida bebida2 = new MisturaDaCasa(); bebida2 = new Chocolate(bebida2); bebida2 = new Chocolate(bebida2); bebida2 = new Leite(bebida2); System.out.println(bebida2.getDescricao() + " R$ " + bebida2.custo()); Bebida bebida3 = new Expresso(); bebida3 = new Creme(bebida3); bebida3 = new Chocolate(bebida3); bebida3 = new Leite(bebida3); System.out.println(bebida3.getDescricao() + " R$ " + bebida3.custo()); } }
  • 44.   Herança nem sempre produz designs flexíveis   O design deveria permitir adição de comportamento sem afetar o que já existe   Composição e delegação podem sempre ser usadas para adicionar novos comportamentos em tempo de execução   O padrão Decorator fornece uma alternativa ao uso de subclasses para adicionar comportamento   O padrão Decorator é constituído de um conjunto de classes Decorator que são usadas para envolver componentes concretos   As classes Decorator são do mesmo tipo da classes que envolvem   Decorators mudam o comportamento de seus componentes adicionando novas funcionalidades   Você pode envolver componentes a quantidade de Decorators que desejar   O padrão Decorator pode resultar em muitos pequenos objetos, e o uso exagerado pode se tornar complexo
  • 46. Aplicabilidade   Use o padrão Decorator quando:   Acrescentar responsabilidades a objetos individuais de forma dinâmica e transparente (sem afetar outros objetos)   Para responsabilidades que podem ser removidas   Quando a extensão através de subclasses não é prática
  • 47. Participantes   Component   Define uma interface para objetos que podem ter responsabilidades acrescentadas aos mesmos dinamicamente   ConcreteComponent   Define um objeto para o qual responsabilidades adicionais podem ser atribuídas   Decorator   Mantém uma referência para um objeto Component e define uma interface que segue a interface de Component   ConcreteDecorator   Acrescenta responsabilidades ao componente
  • 48. Colaborações   Decorator repassa solicitações para o seu objeto Component   Opcionalmente, pode o Decorator pode executar operações adicionais antes e depois de repassar a solicitação
  • 49. Consequências   Maior flexibilidade do que a herança estática   Responsabilidades removidas e acrescentadas em tempo de execução através de associação e dissociação   Enquanto o mecanismo da herança cria uma nova subclasses para cada funcionalidade   Decorators permitem que propriedades sejam adicionadas 2 ou mais vezes   Evita classes sobrecarregadas de características na parte superior da hierarquia   Use quando for necessário
  • 50. Consequências   Grande quantidade de pequenos objetos   Sistemas compostos por uma grande quantidade de objetos parecidos   Objetos diferem diferem na maneira que são interconectados   Sistemas fáceis de customizar por quem os compreende   Difíceis de aprender e depurar