JAVA - Apostila
532 pág.

JAVA - Apostila


DisciplinaProgramação Orientada A Objetos3.913 materiais57.357 seguidores
Pré-visualização28 páginas
Terra (rterrabh@gmail.com) POO 11 de março de 2013 360 / 527
Padrões de Projeto
Decorator
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 361 / 527
Padrões de Projeto \u2013 Decorator
Decorator
É um padrão estrutural que permite \u2013 dinamicamente \u2013
agregar responsabilidades adicionais a um objeto
É uma alternativa flexível ao uso de subclasses para
extensão de funcionalidades
Largamente utilizado na API de manipulação de arquivos
em Java (veja p. 1)
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 362 / 527
Padrões de Projeto \u2013 Decorator
Estrutura
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 363 / 527
Padrões de Projeto \u2013 Decorator
Exemplo
Suponha que você tenha um texto a ser renderizado e que
algumas você você deseja que:
seja exibido normalmente
seja exibido em negrito
seja exibido com um link
seja exibido em negrito como um link
Esse é nosso problema exemplo e a solução é uso do
padrão Decorator
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 364 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Diagrama de Classes
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 365 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Interface Text
1 public interface Text {
public String getRenderization(); /* obtem o codigo HTML */
3 }
Exemplo \u2013 Implementação Simples \u2013 PlainText
public class PlainText implements Text {
2 private String text;
4 public PlainText(String text) {
this.text = text;
6 }
8 @Override
public String getRenderization() {
10 return this.text;
}
12 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 366 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Decorator Abstrato TextDecorator
1 public abstract class TextDecorator implements Text {
protected Text decoratedText; /* texto a decorar */
3
public TextDecorator(Text decoratedText) {
5 this.decoratedText = decoratedText;
}
7
@Override
9 public String getRenderization() {
return decoratedText.getRenderization();
11 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 367 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Decorator Concreto BoldTextDecorator
public class BoldTextDecorator extends TextDecorator {
2
public BoldTextDecorator(Text decoratedText) {
4 super( decoratedText );
}
6
@Override
8 public String getRenderization() {
return &quot;<b>&quot; + decoratedText.getRenderization() + &quot;</b>&quot;;
10 }
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 368 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Decorator Concreto LinkTextDecorator
public class LinkTextDecorator extends TextDecorator {
2 private String link;
4 public LinkTextDecorator(Text decoratedText, String link) {
super( decoratedText );
6 this.link = link;
}
8
@Override
10 public String getRenderization() {
return &quot;<a href=\&quot;&quot; + this.link + &quot;\&quot;>&quot;
12 + decoratedText.getRenderization() + &quot;</a>&quot;;
}
14 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 369 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Uso 1 (simples)
public static void main( String[] args ) {
Text texto = new PlainText( &quot;Ricardo Terra&quot; );
System.out.println( texto.getRenderization() );
}
Saída
Ricardo Terra
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 370 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Uso 2 (negrito)
public static void main( String[] args ) {
Text texto = new BoldTextDecorator(
new PlainText( &quot;Ricardo Terra&quot; ) );
System.out.println( texto.getRenderization() );
}
Saída
<b>Ricardo Terra</b>
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 371 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Uso 3 (link)
public static void main( String[] args ) {
Text texto = new LinkTextDecorator(
new PlainText( &quot;Ricardo Terra&quot; ),
&quot;http://www.ricardoterra.com.br&quot; );
System.out.println( texto.getRenderization() );
}
Saída
<a href=&quot;http://www.ricardoterra.com.br&quot;>Ricardo
Terra</a>
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 372 / 527
Padrões de Projeto \u2013 Decorator
Exemplo \u2013 Uso 4 (link em negrito)
public static void main( String[] args ) {
Text texto = new LinkTextDecorator(
new PlainText( &quot;Ricardo Terra&quot; ),
&quot;http://www.ricardoterra.com.br&quot; );
System.out.println( texto.getRenderization() );
}
Saída
<a href=&quot;http://www.ricardoterra.com.br&quot;><b>Ricardo
Terra</b></a>
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 373 / 527
Padrões de Projeto
Abstract Factory
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 374 / 527
Padrões de Projeto \u2013 Abstract Factory
Abstract Factory
É um padrão de criação que fornece uma forma de
criação de família de objetos relacionados ou
dependentes sem especificar suas classes concretas
Assim, os clientes não se acoplam às implementações
(classes concretas), mas sim, apenas às interfaces
Isso vai a favor do princípio de programação conhecido
como Programação por Interface
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 375 / 527
Padrões de Projeto \u2013 Abstract Factory
Estrutura
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 376 / 527
Padrões de Projeto \u2013 Abstract Factory
Estrutura \u2013 Explicação Básica
Na necessidade de um Button, a aplicação busca a
respectiva fábrica
Assim, é retornada um WinFactory ou um OSXFactory
A aplicação não sabe qual fábrica foi retornada, mas,
independente de qual fábrica, ela é capaz de criar Button
Devido ao contrato estabelecido pela interface
E assim criará e manipulará botões como Button, isto é,
sem saber qual classe concreta realmente está
manipulando
Mais uma vez: Programação por Interfaces
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 377 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo
Suponha que você tenha um sistema que
automaticamente antes das 12h a interface do sistema seja
gráfica e, após esse horário, a interface seja textual
Esse é nosso problema exemplo e a solução é uso do
padrão Abstract Factory
Isto é, teremos duas fábricas: textual e gráfica
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 378 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo \u2013 Diagrama de Classes
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 379 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo \u2013 Interface Input (alunos devem fazer)
public interface Input {
2 String ler();
}
Exemplo \u2013 Interface Output
1 public interface Output {
void escrever( String s );
3 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 380 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo \u2013 Implementação Saída Textual \u2013 TextualOutput
1 public class TextualOutput implements Output {
3 @Override
public void escrever( String s ) {
5 System.out.print( s );
}
7 }
Exemplo \u2013 Implementação Saída Gráfica \u2013 GraphicalOutput
1 public class GraphicalOutput implements Output {
3 @Override
public void escrever( String s ) {
5 JOptionPane.showMessageDialog( null, s );
}
7 }
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 381 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo \u2013 Fábrica Abstrata \u2013 IOFactory
1 public abstract class IOFactory {
3 public final static IOFactory getIOFactory() {
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 11) {
5 return new TextualFactory();
}else{
7 return new GraphicalFactory();
}
9 }
11 public abstract Input getInput();
13 public abstract Output getOutput();
}
Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 382 / 527
Padrões de Projeto \u2013 Abstract Factory
Exemplo \u2013 Fábrica Concreta \u2013 TextualFactory
public class TextualFactory extends IOFactory {
2
@Override