Voici un résumé du ** modèle composite ** dans le modèle de conception du GoF.
-Le mot anglais Composite signifie ** mélange ** ou ** composite **. -Le modèle composite est une méthode qui rend le contenu identique au conteneur et crée une structure récursive **. --Il peut être pratique de traiter le conteneur et son contenu comme du même type, tout comme un répertoire et un fichier sont traités comme une entrée de répertoire. Par exemple, vous pouvez mettre le contenu dans le conteneur, ou vous pouvez en mettre plus dans le conteneur. De cette façon, vous pouvez créer une structure récursive.
Un programme qui affiche une liste de répertoires et de fichiers.
Il s'agit de la classe de base pour File et Directory.
Entry.java
public abstract class Entry {
public abstract String getName();
protected abstract void printList(String prefix);
public void printList() {
printList("");
}
}
Une classe qui représente un fichier.
File.java
public class File extends Entry {
private String name;
public File(String name) {
this.name = name;
}
public String getName() {
return name;
}
protected void printList(String prefix) {
System.out.println(prefix + "/" + name);
}
}
Une classe qui représente un répertoire.
Directory.java
import java.util.ArrayList;
import java.util.Iterator;
public class Directory extends Entry {
private String name;
private ArrayList<Entry> directory = new ArrayList<Entry>();
public Directory(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Entry add(Entry entry) {
directory.add(entry);
return this;
}
protected void printList(String prefix) {
System.out.println(prefix + "/" + name);
Iterator<Entry> it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry) it.next();
entry.printList(prefix + "/" + name);
}
}
}
Cette classe effectue le traitement principal.
Main.java
public class Main {
public static void main(String[] args) {
Directory workspaceDir = new Directory("workspace");
Directory compositeDir = new Directory("composite");
Directory testDir1 = new Directory("test1");
Directory testDir2 = new Directory("test2");
workspaceDir.add(compositeDir);
workspaceDir.add(testDir1);
workspaceDir.add(testDir2);
File directory = new File("Directory.java");
File entity = new File("Entity.java");
File file = new File("file.java");
File main = new File("main.java");
compositeDir.add(directory);
compositeDir.add(entity);
compositeDir.add(file);
compositeDir.add(main);
workspaceDir.printList();
}
}
/workspace
/workspace/composite
/workspace/composite/Directory.java
/workspace/composite/Entity.java
/workspace/composite/file.java
/workspace/composite/main.java
/workspace/test1
/workspace/test2
Étant donné que tous les objets (fichier, répertoire) ont une classe abstraite commune, ils peuvent être traités de manière uniforme sans avoir à connaître le contenu dont est fichier ou répertoire du point de vue du client. .. De plus, même si vous ajoutez une nouvelle classe (par exemple SymbolicLink), cela n'affectera pas le traitement du client à moins que l'interface de la classe de base (Entry) ne change.
Cet article et exemple de programme ont été créés à partir des livres suivants.
C'était très facile à comprendre et j'ai beaucoup appris. Je vous remercie. Les explications détaillées des modèles de conception et des exemples de programmes sont écrites, veuillez donc également consulter les livres.
Recommended Posts