十一、composite组成 对容器和内容一视同仁
public abstract class Entry {
abstract String getName();
abstract int getSize();
public Entry add(Entry entry) throws FileTreatmentException{
throw new FileTreatmentException();
}
public void printList(){
printList("");
}
protected abstract void printList(String prefix);
@Override
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;
}
@Override
String getName() {
return name;
}
@Override
int getSize() {
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix+"/"+this);
}
}
public class Directory extends Entry {
private String name;
private Vector directory=new Vector();
public Directory(String name) {
this.name = name;
}
@Override
String getName() {
return name;
}
@Override
int getSize() {
int size=0;
Iterator iterator = directory.iterator();
while (iterator.hasNext()){
Entry entry=(Entry) iterator.next();
size+=entry.getSize();
}
return size;
}
@Override
protected void printList(String prefix) {
System.out.println(prefix+"/"+this);
Iterator iterator = directory.iterator();
while (iterator.hasNext()){
Entry entry=(Entry)iterator.next();
entry.printList(prefix+"/"+name);
}
}
public Entry add(Entry entry){
directory.add(entry);
return this;
}
}
public class FileTreatmentException extends RuntimeException {
public FileTreatmentException(){
}
public FileTreatmentException(String msg){
super(msg);
}
}
public class Test {
public static void main(String[] args) {
try {
Directory root = new Directory("root");
Directory bin = new Directory("bin");
Directory usr = new Directory("usr");
root.add(bin);
root.add(usr);
bin.add(new File("joanna",1000));
usr.add(new File("ZHOUZHOU",1999));
root.printList();
} catch (FileTreatmentException e) {
e.printStackTrace();
}
}
}