package VisitorPattern; public interface Acceptor { public abstract void accept(Visitor v); } package VisitorPattern; import java.util.Iterator; public abstract class Entry implements Acceptor { public abstract String getName(); public abstract int getSize(); public Entry add(Entry entry) throws FileTreatmentException{ throw new FileTreatmentException(); } public Iterator iterator() throws FileTreatmentException{ throw new FileTreatmentException(); } public String toString(){ return getName() + "("+getSize()+")"; } } package VisitorPattern; import java.util.Iterator; import java.util.Vector; public class Directory extends Entry{ private String name; private Vector dir = new Vector(); public Directory(String name){ this.name = name; } public String getName(){ return name; } public int getSize(){ int size = 0; Iterator it = dir.iterator(); while(it.hasNext()){ Entry entry = (Entry)it.next(); size += entry.getSize(); } return size; } public Entry add(Entry entry){ dir.add(entry); return this; } public Iterator iterator(){ return dir.iterator(); } public void accept(Visitor v){ v.visit(this); } } package VisitorPattern; public class File extends Entry{ private String name; private int size; public File(String name,int size){ this.name = name; this.size = size; } public int getSize(){ return size; } public String getName(){ return name; } public void accept(Visitor v){ v.visit(this); } } package VisitorPattern; public abstract class Visitor { public abstract void visit(File file); public abstract void visit(Directory directory); } package VisitorPattern; import java.util.Iterator; public class ListVisitor extends Visitor{ private String currentdir = ""; public void visit(File file){ System.out.println(currentdir + "/" + file); } public void visit(Directory directory){ System.out.println(currentdir + "/" + directory); String savedir = currentdir; currentdir = currentdir + "/" + directory.getName(); Iterator it = directory.iterator(); while(it.hasNext()){ Entry entry = (Entry)it.next(); entry.accept(this); } currentdir = savedir; } } package VisitorPattern; public class FileTreatmentException extends RuntimeException{ public FileTreatmentException(){} public FileTreatmentException(String msg){ super(msg); } } package VisitorPattern; public class Main { public static void main(String[] args){ try { System.out.println("Making root entries..."); Directory rootdir = new Directory("root"); Directory bindir = new Directory("bin"); Directory tmpdir = new Directory("tmp"); Directory usrdir = new Directory("usr"); rootdir.add(bindir); rootdir.add(tmpdir); rootdir.add(usrdir); bindir.add(new File("vi",1000)); bindir.add(new File("latex",2000)); rootdir.accept(new ListVisitor()); System.out.println(""); System.out.println("Making user entries..."); Directory yuki = new Directory("yuki"); Directory hanako = new Directory("hanako"); Directory tomura = new Directory("tomura"); usrdir.add(yuki); usrdir.add(hanako); usrdir.add(tomura); yuki.add(new File("diary.html",100)); yuki.add(new File("Composizt.java",200)); hanako.add(new File("memo.tex",300)); tomura.add(new File("game.doc",400)); rootdir.accept(new ListVisitor()); tomura.add(new File("junk.mail",500)); } catch (FileTreatmentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }