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

From Wiki**3

Line 1: Line 1:
O padrão "decorator" permite a adição dinâmica de comportamento a um objecto.
+
{{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 10:
 
==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.
 
 
=== Classe que implementa o ''decorator'' ===
 
 
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.
 
 
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:OOP]]
 
[[category:Teaching]]
 
[[category:Teaching]]

Revision as of 22:19, 20 November 2009

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