Difference between revisions of "Decorator Pattern (padrão de desenho)"

From Wiki**3

 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
O padrão "decorator" permite a adição dinâmica de comportamento a um objecto.
+
{{NAVPO}}
 +
{{TOCright}}
 +
O padrão "decorator" permite a adição dinâmica de comportamento a um objecto sem alterar a sua interface.
  
 
==Estrutura==
 
==Estrutura==
Line 9: Line 11:
 
==Exemplo==
 
==Exemplo==
  
Composição de ''streams'' em Java
+
* [[Decorator Pattern (padrão de desenho)/Composição de streams em Java|Composição de streams em Java]]
  
O seguinte exemplo ilustra a programação de um stream em Java: este stream vai ser aplicado como um decorator.
+
== Exercícios ==
  
=== Classe que implementa o ''decorator'' ===
+
* [[Decorator Pattern (padrão de desenho)/Exercício 1: Textos Formatados|Exercício 1: Textos Formatados]]
 +
* [[Decorator Pattern (padrão de desenho)/Exercício 2: Textos Formatados (take 2)|Exercício 2: Textos Formatados (take 2)]]
  
Note-se como o método '''read''' "decora" a acção do método correspondente na superclasse: o objecto decorador continua a permitir a leitura (como se de um stream se tratasse), mas altera os valores lidos.
+
[[category:Ensino]]
 
+
[[category:PO]]
public class LowerCaseInputStream extends FilterInputStream {
 
 
 
  public LowerCaseInputStream(InputStream in) {
 
    super(in);
 
  }
 
 
  public int '''read'''() throws IOException {
 
    int c = super.read();
 
    return (c == -1 ? c : Character.toLowerCase((char)c));
 
  }
 
               
 
  public int '''read'''(byte[] b, int offset, int len) throws IOException {
 
    int result = super.'''read'''(b, offset, len);
 
    for (int i = offset; i < offset+result; i++) {
 
      b[i] = (byte)Character.toLowerCase((char)b[i]);
 
    }
 
    return result;
 
  }
 
 
}
 
 
 
=== Exemplo: Classe de Teste ===
 
 
 
Este exemplo mostra a utilização da classe e a utilização transparente do método '''read'''.
 
 
 
  public class InputTest {
 
 
 
    public static void main(String[] args) throws IOException {
 
      int c;
 
 
 
      try {
 
 
 
        InputStream in =
 
          new '''LowerCaseInputStream'''(
 
            new BufferedInputStream(
 
              new FileInputStream("test.txt")));
 
 
 
        while ((c = in.'''read'''()) >= 0)
 
          System.out.print((char)c);
 
 
 
        in.close();
 
 
 
      } catch (IOException e) {
 
        e.printStackTrace();
 
      }
 
    }
 
 
 
  }
 
 
 
[[category:OOP]]
 
[[category:Teaching]]
 

Latest revision as of 14:03, 19 November 2015

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

O padrão "decorator" permite a adição dinâmica de comportamento a um objecto sem alterar a sua interface.

Estrutura

O padrão decorator tem a seguinte estrutura de classes:

Decorator-dpcd.png

Exemplo

Exercícios