v) { v.visit(this); } … } public class UnixModemConfigurator implements ModemVisitor { public void visit(HayesModem m) { m.configurationString = “&s1=4&D=3”; } public void visit(ZoomModem m) { m.configurationValue = 42; } public void visit(ErnieModem m) { m.internalPattern = “C is too slow”; } } Function overloading ㅎ
class UnixModemConfigurator implements ModemVisitor, ErnieModemVisitor, HayesModemVisitor, ZoomModemVisitor { public void visit(HayesModem m) { m.configurationString = "&s1=4&d3"; } public void visit(ZoomModem m) { m.configurationValue = 42; } public void visit(ErnieModem m) { m.internalPattern = "C is too slow"; } } 의존 관계 순환이 깨지고 새로운 방문 대상 파생형을 추가하거나 점진적 컴파일이 쉬워진다. - 단점 : 훨씬 복잡해
public void addExtension(String extensionType, PartExtension extension) { ..… } public PartExtension getExtension(String extensionType) { ..… } } public class CSVPiecepartExtension implements CSVPartExtension { public String getCSV() { StringBuffer b = new StringBuffer(“Piecepart,”); b.append(itsPiecePart.getpartNumber()); …. Return b.toString(); } } public class CSVAssemblyExtension implements CSVPartExtension { public String getCSV() { StringBuffer b = new StringBuffer(“Assembly,”); b.append(itsPiecePart.getpartNumber()); …. Iterator I = itsAssembly.getParts(); while(i.hasNext()) { Part p = (Part)i.next(); CSVPartExtension ce = (CSVPartExtension) p.getExtenstion(“CSV”); b.append(“,{“); b.append(ce.getCSV()); …. } return b.toString(); } }