패턴 스퍼티 - Visitor 발표 자료

6,542 views
6,078 views

Published on

패턴 스터디 Visitor 패턴 발표 자료

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,542
On SlideShare
0
From Embeds
0
Number of Embeds
3,469
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

패턴 스퍼티 - Visitor 발표 자료

  1. 1. 최범균 (madvirus@madvirus.net) blog: javacan.tistory.com
  2. 2. 문서 구조표현 DocumentElement DocChar CompoisteDocumentElement LineOfText Paragraph Document
  3. 3. 목차 생성 기능 추가 DocumentElement +buildTOC() DocChar CompoisteDocumentElement +buildTOC() +buildTOC() LineOfText Header Document +buildTOC() +buildTOC() +buildTOC()
  4. 4. XML 변환 기능 추가 DocumentElement +buildTOC() +toXML() DocChar CompoisteDocumentElement +buildTOC() +buildTOC() +toXML() +toXML() LineOfText Header Document +buildTOC() +buildTOC() +buildTOC() +toXML() +toXML() +toXML()
  5. 5. 또 다른 기능을 추가하려면?
  6. 6. 예제 구현의 특징 • 서로 다른 기능을 구현한 DocumentElement +buildTOC() 코드가 섞여 있음 +toXML() • 새로운 기능 추가시 모든 DocChar CompoisteDocumentElement 클래스에 수정 발생 +buildTOC() +buildTOC() +toXML() +toXML() • 관련 코드가 여러 노드에 분산 구현되어, – 이해 및 유지&변경 어려움 LineOfText Header Document +buildTOC() +buildTOC() +buildTOC() +toXML() +toXML() +toXML()
  7. 7. 해법은 특정 기능 관련 코드들을 Visitor라 불리는 별도 클래스로 분리
  8. 8. Visitor 패턴의 구조 <<Interface>> DocumentElement Visitor +accept(visitor : Visitor) +visit(docChar : DocChar) +visit(lineOfTest : LineOfText) +visit(header : Header) +visit(document : Document) +visit(composite : CompositeElement) DocChar CompoisteElement +accept(visitor : Visitor) +accept(visitor : Visitor) Document LineOfText Header +accept(visitor : Visitor) +accept(visitor : Visitor) +accept(visitor : Visitor)
  9. 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. 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. 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. 12. Visitor의 적용 결과 • 싞규 기능 추가가 쉽다. – 새로운 Visitor만 추가하면 됨 – 기존 코드는 그대로 유지 • 구조의 변화가 적은 경우 유리 • 캡슐화 약화 – Visitor가 구체 클래스에 커플링 됨
  13. 13. 질문 있으세요?

×