terça-feira, 9 de novembro de 2010

Composite Pattern



Definição

O composite pattern ajuda você a criar estruturas de árvore de objetos sem a necessidade de forçar os clientes a diferenciar entre galhos e folhas em relação ao uso. O composite pattern permite que clientes tratem objetos individuais e composições de objetos uniformemente.

Quando usar

• Quando você quiser representar uma relação todo-parte em uma estrutura de árvore.
• Quando você quiser que os clientes sejam capazes de ignorar as diferenças entre composições de objetos e objetos individuais.
• Quando a estrutura pode ter qualquer nível de complexidade e é dinâmica.

Benefícios

• Definir hierarquias de classe constituída de objetos primitivos e objetos compostos
• Torna mais fácil a adição de um novo tipo de componentes.

Desvantagens / consequências

O padrão Composite torna mais fácil para você adicionar novos tipos de componentes a sua coleção, desde que suporte uma interface de programação similar. Por outro lado, este tem a desvantagem de tornar o sistema muito
geral. Você pode achar mais difícil para restringir determinadas categorias, quando tal, normalmente, é desejável.

 


Exemplo

package com.logica.composite;
public interface AbstractFile {
public void ls();
}

package com.logica.composite;
import java.util.ArrayList;
public class Directory implements AbstractFile {
private String name;
private ArrayList<AbstractFile> files = new
ArrayList<AbstractFile>();
private Indentation indentation;

public Directory (String name, Indentation indentation) {
this.name = name;
this.indentation = indentation;
}

public void add(AbstractFile f) {
files.add(f);
}

public void ls() {
System.out.println(indentation.getIndentation() + name);
indentation.increaseIndentation();

for (AbstractFile file : files) {
file.ls();
}

indentation.decreaseIndentation();
}
}

package com.logica.composite;
class File implements AbstractFile {
private String name;
private Indentation indentation;

public File(String name, Indentation indentation) {
this.name = name;
this.indentation = indentation;
}
public void ls() {
System.out.println(
indentation.getIndentation() + name);
}
}

package com.logica.composite;
public class Indentation {
private StringBuffer sbIndent = new StringBuffer();

public String getIndentation() {
return sbIndent.toString();
}

public void increaseIndentation() {
sbIndent.append(" ");
}

public void decreaseIndentation() {
if (sbIndent.length() >= 3) {
sbIndent.setLength(sbIndent.length() - 3);
}
}
}
package com.logica.composite;
public class CompositeDemo {
public static void main(String[] args) {
Indentation indentation = new Indentation();
Directory dirOne     = new Directory("dir111", indentation);
Directory dirTwo     = new Directory("dir222", indentation);
Directory dirThree  = new Directory("dir333", indentation);
File a                      = new File("a", indentation);
File b                      = new File("b", indentation);
File c                      = new File("c", indentation);
File d                      = new File("d", indentation);
File e                      = new File("e", indentation);
dirOne.add(a);
dirOne.add(dirTwo);
dirOne.add(b);
dirTwo.add(c);
dirTwo.add(d);
dirTwo.add(dirThree);
dirThree.add(e);
dirOne.ls();
}
}
Quando BridgeExample é executado o resultado é:
dir111
 um
 dir222
 c
 d
 dir333
 e
b


Nenhum comentário:

Postar um comentário