$B:n@.(B:2004$BG/(B6$B7n(B7$BF|(B
Visitor$B%Q%?!<%s$o!"=89g$nmwag$r(b1$b$d(b1$b$d=d$c$f!"2?$i$+$n=hm}$r9t$c$f$$$/;~$n%q%?!<%s$g$"$k!#(b
Visitor$B%Q%?!<%s$g$o!"%g!<%?$h=hm}$rj,$1$f!"jl!9$n%/%i%9$h$7$f:n$k!#$=$7$f!"$3$n(b2$b$d$n%/%i%9$,!"8_$$$kaj
$B6qBNE*$K$O!"2<5-$n$h$&$k$j$c$f$$$k!#(bacceptor$b%$%s%?!<%u%'!<%9$o!"%g!<%?$ri=$9!#=hm}$rA0$K$J$C$F$$$k!#(BAcceptor1, Acceptor2$B$O!"(BAcceptor$B%$%s%?!<%u%'!<%9$r
$B%@%V%k%G%#%9%Q%C%A$N;EAH$_(B
public interface Acceptor {
public abstract void accept ( Visitor visitor );
}
public class Acceptor1 implements Acceptor {
public void accept ( Visitor visitor ) {
visitor.visit(this);
}
}
public class Acceptor2 implements Acceptor {
public void accept ( Visitor visitor ) {
visitor.visit(this);
}
}
public abstract class Visitor {
public abstract void visit ( Acceptor1 acceptor1 );
public abstract void visit ( Acceptor2 acceptor2 );
}
public class Visitor1 extends Visitor {
public void visit ( Acceptor1 acceptor1 ) {
// acceptor1$B$K$D$$$F$N=hM}$r
Visitor$B%Q%?!<%s$g$o!"(bvisitor$b$o<+j,<+?h$r0z?t$h$7$f!"(bacceptor$b$n(baccept$b%a%=%c%i$r8f$s=p$9!#$^$?!"(bacceptor$b$o<+j,<+?h$r0z?t$h$7$f!"(bvisitor$b$n(bvisit$b%a%=%c%i$r8f$s=p$9!#(b
$B$3$l$i$O!"0l8+$9$k$HBP>NE*$J8F$S=P$74X78$K$"$k$h$&$K;W$($k$,!"NE*$G$O$J$$!#(B
Acceptor$B$N(Baccept$B%a%=%C%I$O!"0z?t$H$7$F(BVisitor$B$r
$B0lJ}!"(BVisitor$B$N(Bvisit$B%a%=%C%I$O!"0z?t$H$7$F(BAcceptor$B%$%s%?!<%u%'!<%9$g$o$j$/!"$=$n%$%s%?!<%u%'!<%9$r
Visitor$B$N(Bvisit$B%a%=%C%I$K$O!"6qBNE*$J=hM}$r5-=R$9$k!#=hM}$NFbMF$O!"%G!<%?$k$h$c$f0[$j$k!#$=$n$?$a!"(bvisit$b%/%i%9$n0z?t$o!"cj>]E*$J(BAcceptor$B%$%s%?!<%u%'!<%9$g$o$j$/!"6qbne*$j
$B$3$NHsBP>N@-$K$h$j!"(BVisitor$B%Q%?!<%s$r;h$c$?;eah$_$g$o!"3hd%$nj}8~@-$o
$BKAF,$N35MW$rFI$`$H!"(BIterator$B%Q%?!<%s(b$B$N2r@b$K$"$k35MW$H!"NI$/;w$F$$$k!#(B
Visitor$B%Q%?!<%s$o!"=89g$nmwag$r(b1$b$d(b1$b$d=d$c$f!"2?$i$+$n=hm}$r9t$c$f$$$/;~$n%q%?!<%s$g$"$k!#(b
Iterator$B%Q%?!<%s$o!"=89g$nmwag$k=g$k(b1$b$d$:$d%"%/%;%9$9$k;~$n%q%?!<%s$g$"$k!#(b
Iterator$B%Q%?!<%s$r;h$c$f!"=89g$nmwag$k2?$i$+$n=hm}$r9t$&>l9g$O!"
Iterator it = set.iterator();
while (it.hasNext()) {
Data data = (Data)it.next();
operator.operate(data);
}
Iterator$B%Q%?!<%s$g$o!"$?$/$5$s$nmwag$k$d$$$f(b1$b$d(b1$b$d=hm}$r9t$c$f$$$k$3$h$,ni$/j,$+$k!#(b
$B0lJ}!"(BVisitor$B%Q%?!<%s$g$o!"
operator.operator(data);
Visitor$B%Q%?!<%s$g$o!"$"$k(b1$b$d$nmwag$k$d$$$f8f$s=p$;$p!"%@%v%k%g%#%9%q%c%a$n;eah$_$k$h$c$f!"$=$nmwag$+$ic)$l$kmwag$k$d$$$f!"
Visitor$B%Q%?!<%s$k$d$$$f!"2<5-$nk\(b($b0j2
Java$B8@8l$G3X$V%G%6%$%s%Q%?!<%sf~lg(b
$B7k>k9@Cx(B
$B%=%U%H%P%s%/%Q%V%j%C%7%s%03t<02q
$B$G
$B!V%G%6%$%s%Q%?!<%sf~lg!w$g$o!"%u%!%$%k$d%g%#%l%/%h%j$n0lmw$ri=<($9$k=hm}$k(bvisitor$b%q%?!<%s$,;h$o$l$f$$$k!#$7$+$7!"!v%g%6%$%s%q%?!<%sf~lg!w$n(blistvisitor$b%/%i%9$o!":f5"8f$s=p$7$r;h$c$f!"
public class ListVisitor {
private String currentdir = "";
public void visit (Entry entry) {
System.out.println(currentdir + "/" + entry);
String savedir = currentdir;
currentdir = currentdir + "/" + entry.getName();
try {
Iterator it = entry.iterator();
while (it.hasNext()) {
Entry entry = (Entry)it.next();
visit(entry);
}
} catch ( FileTreatmentException exception ) {
}
currentdir = savedir;
}
}
$B4:$($FJ#;($J(BVisitor$B%Q%?!<%s$r;h$&i,mw$o$j$$!#(b
$B!V%G%6%$%s%Q%?!<%sf~lg!w$g$o!"%u%!%$%k$d%g%#%l%/%h%j$n0lmw$ri=<($9$k=hm}$k(bvisitor$b%q%?!<%s$r;h$c$f$$$k$,!"$=$nm}m3$h$7$f!"!x%g!<%?9=b$$h=hm}$rj,n%$9$k$?$a!y$h$5$l$f$$$k!#$7$+$7!"$3$l$o8m$c$f$$$k$h;w$&!#(b
$B!V%G%6%$%s%Q%?!<%sf~lg!w$k$o!"O$,$"$k!#(B
$B$b$7!"=hM}$NFbMF$r(BFile$B%/%i%9$d(BDirectory$B%/%i%9$N%a%=%C%I$H$7$F%W%m%0%i%`$7$F$7$^$&$H!"?7$7$$!V=hM}!W$rDI2C$7$F5!G=3HD%$7$?$/$J$k$?$S$K!"(BFile$B%/%i%9$d(BDirectory$B%/%i%9$r=$@5$7$J$1$l$P$J$i$J$/$J$j$^$9!#(B
$B$3$3$G@bL@$5$l$F$$$k$N$O!"!X%G!<%?9=b$$h=hm}$nj,n%!y$g$o$j$/!"!x%g!<%?$h=hm}$nj,n%!y$g$"$k!#(b
$B!V%G%6%$%s%Q%?!<%sf~lg!w$nnc$g$o!"%g!<%?9=b$$o
$B!V%G%6%$%s%Q%?!<%sf~lg!w$nnc$g!"=hm}$ri=$7$f$$$k$n$o(blistvisitor$b%/%i%9$g$"$k!#$7$+$7!"=hm}$ri=$7$f$$$k$o$:$n(blistvisitor$b%/%i%9$n%3!<%i$rfi$`$h!">e5-$N%G!<%?9=b$$,!"$=$n$^$^
$B%G!<%?9=b$$h=hm}$rj,n%$9$k$?$a$k$o!"(bvisitor$b%q%?!<%s$g$o$j$/!"(bIterator$B%Q%?!<%s(b$B$r;H$&$Y$-$H9M$($k!#(B
$BNc$($P!"?ML>%j%9%H$K4^$^$l$k?ML>$r0lMwI=<($9$k$3$h$r9m$($f$_$h$&!#?ml>%j%9%H$N%G!<%?9=b$$o!"8d?t$n>e8B$,7h$^$C$?G[Ns$K$J$C$F$$$k$+$b$7$l$J$$$7!"@hF,$+$i=g$KJB$s$@%j%9%H$K$J$C$F$$$k$+$b$7$l$J$$!#$^$?$O!"8!:w$,$7$d$9$$$h$&$K!"FsJ,LZ$K$J$C$F$$$k$+$b$7$l$J$$!#(B
$B?ML>%j%9%H$N%G!<%?9=b$$,$i$n$h$&$k$j$c$f$$$f$bni$$$h$&$k!"0lmwi=<($9$k=hm}$r:n$k$?$a$k$o!"?ml>%j%9%H$,;}$D?ML>%G!<%?$k(b1$b$d(b1$b$d%"%/%;%9$g$-$k$h$&$j(biterator$b$r!"?ml>%j%9%H$,JV$9$h$&$K$J$C$F$$$l$PNI$$!#(B
$B?ML>%j%9%H$N%G!<%?9=b$$rjq99$9$k$h!"(biterator$b$b=q$-49$($ki,mw$,$"$k!#$@$,!"0lmwi=<($r$9$k=hm}$o(biterator$b$r;h$c$f=q$+$l$f$*$j!"%g!<%?9=b$$k0mb8$7$f$$$j$$$n$g!"%g!<%?9=b$$,jq$o$c$f$b!"=q$-49$($ki,mw$o$j$$!#(b
Iterator$B%Q%?!<%s$r;h$&$b$&(b1$b$d$n%a%j%c%h$o!"%"%/%;%9=g=x$h=hm}$bj,n%$g$-$k$3$h$@!#?ml>%j%9%H$r!"$"$$$&$($*=g$KI=<($7$?$$>l9g$O!"?ML>$K$"$$$&$($*=g$K%"%/%;%9$9$k(Biterator$B$r:n$l$PNI$$!#%"%k%U%!%Y%C%H=g$KI=<($7$?$$>l9g$O!"%"%k%U%!%Y%C%H=g$K%"%/%;%9$9$k(Biterator$B$r:n$l$PNI$$!#$$$:$l$K$;$h!"0lMwI=<($r$9$k=hm}$k$o!"
$B!V%G%6%$%s%Q%?!<%sf~lg!w$nnc$k$"$k(blistvisitor$b%/%i%9$o!"%g%#%l%/%h%j$h%u%!%$%k$r:n@.$7$?=g$k$7$+i=<($g$-$j$$!#$b$7!"%"%k%u%!%y%c%h=g$ki=<($7$?$j!"%g%#%l%/%h%j$@$1$r@h$ki=<($7$?$/$j$c$?;~$o!"$=$n$?$s$k(blistvisitor$b$hni$/;w$?jl$n(bvisitor$b%/%i%9$r:n$i$j$/$f$o$j$i$j$$!#(b
$BA0>O$G$O!"!V%G%6%$%s%Q%?!<%sf~lg!w$k:\$c$f$$$knc$r!":f5"8f$s=p$7$r;h$c$f=q$-49$($?!#(b
$B:F5"8F$S=P$7$r;H$C$?>l9g$N(BListVisitor$B%/%i%9$rNI$/8+$k$H!"(BFile$B%/%i%9$d(BDirectory$B%/%i%9$O;H$o$l$F$*$i$:!"(BEntry$B%/%i%9$@$1$r;H$C$F5-=R$5$l$F$$$k$3$H$,J,$+$k!#$9$J$o$A!"
$B$b$7!"(BListVisitor$B%/%i%9$,!"(B
$B$H$$$&;EMM$G$"$C$?>l9g$O!"
public class ListVisitor {
private String currentdir = "";
public void visit (Entry entry) {
if (entry instanceof File) {
File file = (File)entry;
System.out.println(currentdir + "/" + file.getFileName());
} else if (entry instanceof Directory) {
Directory directory = (Directory)entry;
System.out.println(currentdir + "/" + directory.getTitle());
}
:
}
}
$B$b$7$/$O!"
public class ListVisitor {
private String currentdir = "";
public void visit (File file) {
System.out.println(currentdir + "/" + file.getFileName());
}
public void visit (Directory directory) {
System.out.println(currentdir + "/" + directory.getTitle());
String savedir = currentdir;
currentdir = currentdir + "/" + directory.getName();
Iterator it = directory.iterator();
while (it.hasNext()) {
Entry entry = (Entry)it.next();
if (entry instanceof File) {
visit((File)entry);
} else if (entry instanceof Directory) {
visit((Directory)entry);
}
}
currentdir = savedir;
}
}
$B$3$N>l9g$O!"(BFile$B$H(BDirectory$B$H$G$O!"=hM}$,0[$J$k!#$9$J$o$A!"(BListVisitor$B$,=hM}$r9T$&BP>]$O!"(BEntry$B$H$$$&(B1$B$D$N%G!<%?$g$o$j$/!"(bfile$b$h(bdirectory$b$h$$$&(b2$b
$B$3$N$h$&$K!"=89g$K$$$/$D$+$N0[$J$kMWAG$,4^$^$l$F$$$k>l9g$O!":F5"8F$S=P$7$d(BIterator$B$r;H$&$H!">l9gJ,$1$,I,MW$K$J$C$F$7$^$&!#MWAG$N
Visitor$B%Q%?!<%s$r;h$&$h!"(binstanceof$b$d%-%c%9%h$r;h$&i,mw$,$j$/!"(bif$bj8$nj,4t$,jb$v$3$h$b$j$$!#(b
$B2?
File$B%/%i%9$N(Baccept$B%a%=%C%I$O!"<+j,<+?h!"$9$j$o$a(bfile$b%$%s%9%?%s%9$r0z?t$h$9$k(bvisit$b%a%=%c%i$r8f$s=p$9!#$=$n7k2l!"(bfile$b$kbp$9$k=hm}$,e,@z$k9t$o$l$k$n$g$"$k!#(b
$B;d$J$j$K9M$($?$H$3$m$G$O!"(BVisitor$B%Q%?!<%s$r;h$&$y$-%1!<%9$o!"2<5-$n>l9g$7$+;W$$$D$+$J$+$C$?!#(B
$B!V%G%6%$%s%Q%?!<%sf~lg!w$nnc$k$b$"$k$h$&$k!"%d%j!<9=b$$kbp$7$f2?$i$+$n=hm}$r$9$k;~$o!"(bvisitor$b%q%?!<%s$r;h$&$3$h$,m}a[$@$h;w$o$l$f$$$k$+$b$7$l$j$$!#$@$,!"
$B=89g$K$$$/$D$+$N0[$J$kMWAG$,4^$^$l$F$$$k>l9g$G$b!"(BVisitor$B%Q%?!<%s$r;h$o$j$$;~$n%g%a%j%c%h$o!"(bif$bj8$nj,4t$,jb$v$3$h$@$1$g$"$k!#(bvisitor$b%q%?!<%s$r;h$&$h!":f5"8f$s=p$7$,;}$d%7%s%w%k$5$d!"(biterator$b$k$h$k%g!<%?9=b$$h=hm}$nj,n%$h$$$c$?%a%j%c%h$r<:$&$3$h$k$j$k!#(bvisitor$b%q%?!<%s$r;h$&:]$k$o!"$3$l$i$n%a%j%c%h!&%g%a%j%c%h$rgi$k$+$1$ki,mw$,$"$k$h;w$&!#(b