• Save
패턴 스퍼티 - Visitor 발표 자료
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

패턴 스퍼티 - Visitor 발표 자료

  • 6,926 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
6,926
On Slideshare
3,551
From Embeds
3,375
Number of Embeds
3

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 3,375

http://javacan.tistory.com 2,799
http://cherrykyun.tistory.com 573
http://www.slideshare.net 3

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 최범균 (madvirus@madvirus.net) blog: javacan.tistory.com
  • 2. 문서 구조표현 DocumentElement DocChar CompoisteDocumentElement LineOfText Paragraph Document
  • 3. 목차 생성 기능 추가 DocumentElement +buildTOC() DocChar CompoisteDocumentElement +buildTOC() +buildTOC() LineOfText Header Document +buildTOC() +buildTOC() +buildTOC()
  • 4. XML 변환 기능 추가 DocumentElement +buildTOC() +toXML() DocChar CompoisteDocumentElement +buildTOC() +buildTOC() +toXML() +toXML() LineOfText Header Document +buildTOC() +buildTOC() +buildTOC() +toXML() +toXML() +toXML()
  • 5. 또 다른 기능을 추가하려면?
  • 6. 예제 구현의 특징 • 서로 다른 기능을 구현한 DocumentElement +buildTOC() 코드가 섞여 있음 +toXML() • 새로운 기능 추가시 모든 DocChar CompoisteDocumentElement 클래스에 수정 발생 +buildTOC() +buildTOC() +toXML() +toXML() • 관련 코드가 여러 노드에 분산 구현되어, – 이해 및 유지&변경 어려움 LineOfText Header Document +buildTOC() +buildTOC() +buildTOC() +toXML() +toXML() +toXML()
  • 7. 해법은 특정 기능 관련 코드들을 Visitor라 불리는 별도 클래스로 분리
  • 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. 구현 - 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가 구체 클래스에 커플링 됨
  • 13. 질문 있으세요?