|
|
(9 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | Material correspondente à aula 27.
| + | {{NAVPO}} |
− | | + | {{TOCright}} |
− | O padrão "decorator" permite a adição dinamica de comportamento a um objecto. | + | O padrão "decorator" permite a adição dinâmica de comportamento a um objecto sem alterar a sua interface. |
| | | |
| ==Estrutura== | | ==Estrutura== |
Line 11: |
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.
| |
− | | |
− | === 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'''.
| + | == Exercícios == |
| | | |
− | public class InputTest {
| + | * [[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)]] |
− | 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:Ensino]] |
| + | [[category:PO]] |
O padrão "decorator" permite a adição dinâmica de comportamento a um objecto sem alterar a sua interface.