Composite パターン
public int getSize() { // サイズを得る int size = 0; Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); size += entry.getSize(); } return size; }
import java.util.*; public class Main { public static void main(String[] args) { System.out.println("Making root entries..."); Directory rootdir = new Directory("root"); Directory bindir = new Directory("bin"); //Directory tmpdir = new Directory("tmp"); rootdir.add(bindir); //rootdir.add(tmpdir); bindir.add(new File("vi", 10000)); bindir.add(new File("latex", 20000)); rootdir.printList(); } } public abstract class Entry { public abstract String getName(); // 名前を得る public abstract int getSize(); // サイズを得る /*public Entry add(Entry entry) { // エントリを追加する }*/ public void printList() { // 一覧を表示する printList(""); } protected abstract void printList(String prefix); // 一覧を表示する public String toString() { // 文字列表現 return getName() + " (" + getSize() + ")"; } } public class File extends Entry { private String name; private int size; public File(String name, int size) { this.name = name; this.size = size; } public String getName() { return name; } public int getSize() { return size; } protected void printList(String prefix) { System.out.println(prefix + "/" + this.toString()); } } public class Directory extends Entry { private String name; // ディレクトリの名前 private Vector directory = new Vector(); // ディレクトリエントリの集合 public Directory(String name) { // コンストラクタ this.name = name; } public String getName() { // 名前を得る return name; } public int getSize() { // サイズを得る int size = 0; Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); size += entry.getSize(); } return size; } public Entry add(Entry entry) { // エントリの追加 directory.add(entry); return this; } protected void printList(String prefix) { // エントリの一覧 System.out.println(prefix + "/" + this.toString()); Iterator it = directory.iterator(); while (it.hasNext()) { Entry entry = (Entry)it.next(); entry.printList(prefix + "/" + name); } } }