최근 포토로그


2008/09/05 00:57

[DesignPattern - Visitor] sample1 study. note

Design Pattern - Visitor

1. 클래스다이어그램
2. Source
  • Visitor.java
    package com.dazzilove.visitor.sample1;

    public abstract class Visitor {
    public abstract void visit(File file);
    public abstract void visit(Directory directory);
    }
  • Acceptor.java
    package com.dazzilove.visitor.sample1;

    public interface Acceptor {
    public abstract void accept(Visitor v);
    }
  • Entry.java
    package com.dazzilove.visitor.sample1;

    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() + ")";
    }
    }
  • File.java
    package com.dazzilove.visitor.sample1;

    public class File extends Entry {
    private String name;
    private int size;

    public File(String name, int size) {
    this.name = name;
    this.size = size;
    }

    @Override
    public String getName() {
    return name;
    }

    @Override
    public int getSize() {
    return size;
    }

    @Override
    public void accept(Visitor v) {
    v.visit(this);
    }
    }
  • Directory.java
    package com.dazzilove.visitor.sample1;

    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;
    }

    @Override
    public String getName() {
    return name;
    }

    @Override
    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();
    }

    @Override
    public void accept(Visitor v) {
    v.visit(this);
    }
    }
  • ListVisitor.java
    package com.dazzilove.visitor.sample1;

    import java.util.Iterator;

    public class ListVisitor extends Visitor {
    private String currentDir = "";

    @Override
    public void visit(File file) {
    System.out.println(currentDir + "/" + file);
    }

    @Override
    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;
    }
    }
  • FileTreatmentException.java
    package com.dazzilove.visitor.sample1;

    public class FileTreatmentException extends RuntimeException {
    public FileTreatmentException() {
    }
    public FileTreatmentException(String msg) {
    super(msg);
    }
    }
  • Main.java
    package com.dazzilove.visitor.sample1;

    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 kim = new Directory("kim");
    Directory lee = new Directory("lee");
    Directory kang = new Directory("kang");
    usrDir.add(kim);
    usrDir.add(lee);
    usrDir.add(kang);
    kim.add(new File("diary.html", 100));
    kim.add(new File("composite.java", 200));
    lee.add(new File("memo.txt", 300));
    kang.add(new File("game.doc", 400));
    kang.add(new File("junk.mail", 500));
    rootDir.accept(new ListVisitor());
    } catch (FileTreatmentException e) {
    e.printStackTrace();
    }
    }
    }
3. 결과출력

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://dazzilove.egloos.com/tb/790635 [도움말]

핑백

  • dazzilove : 디자인 패턴 공부 2008-09-05 00:58:08 #

    ... 그릇과 내용물의 동일시Decorator sample1 : "Java 언어로 배우는 디자인 패턴 입문" Chapter12. Decorator- 장식과 내용물의 동일시Visitor sample1 : "Java 언어로 배우는 디자인 패턴 입문" Chapter13. Visitor- 구조 안을 돌아다니면서 일을 한다. ... more

덧글

덧글 입력 영역



미투데이

문화꽃 키우기