6. 예제 구현의 특징
• 서로 다른 기능을 구현한
DocumentElement
+buildTOC()
코드가 섞여 있음
+toXML()
• 새로운 기능 추가시 모든
DocChar CompoisteDocumentElement
클래스에 수정 발생
+buildTOC() +buildTOC()
+toXML() +toXML()
• 관련 코드가 여러 노드에
분산 구현되어,
– 이해 및 유지&변경 어려움
LineOfText Header Document
+buildTOC() +buildTOC() +buildTOC()
+toXML() +toXML() +toXML()
9. 구현 - Element
class DocumentElement {
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
class CompositeElement extends DocumentElement {
/* Element에서 자식 노드에 대한 반복 처리 수행
public void accept(Visitor visitor) {
visitor.visit(this);
for (DocumentElement element : getChilds()) {
element.accept(visitor);
}
}
*/
}
10. 구현 - Visitor
class SomeVisitor implements Visitor {
public void visit(Header header) {
header.get…();
…
}
public void visit(CompositeElement composite) {
// Visitor에서 반복 처리 실행
for (DocumentElement child : composite.getChilds()) {
child.accept(this);
}
}
…
}
11. Visitor의 실행
Document document = getDocument();
TOCVisitor tocVisitor = new TOCVisitor();
document.accept(tocVisitor);
TOC toc = tocVisitor.getTOC();
XMLTransformVisitor xmlTrVisitor = new XMLTransformVisitor();
document.accept(xmlTrVisitor);
String xml = xmlTrVisitor.getXML();
12. Visitor의 적용 결과
• 싞규 기능 추가가 쉽다.
– 새로운 Visitor만 추가하면 됨
– 기존 코드는 그대로 유지
• 구조의 변화가 적은 경우 유리
• 캡슐화 약화
– Visitor가 구체 클래스에 커플링 됨