Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
최범균 (madvirus@madvirus.net)
  blog: javacan.tistory.com
문서 구조표현
          DocumentElement




DocChar            CompoisteDocumentElement




          LineOfText        Paragrap...
목차 생성 기능 추가
                DocumentElement
               +buildTOC()




     DocChar                 CompoisteDocumentE...
XML 변환 기능 추가
                DocumentElement
               +buildTOC()
               +toXML()




     DocChar          ...
또 다른 기능을 추가하려면?
예제 구현의 특징

                                                                 • 서로 다른 기능을 구현한
                DocumentElemen...
해법은



      특정 기능 관련 코드들을
Visitor라 불리는 별도 클래스로 분리
Visitor 패턴의 구조
                                                                                                           ...
구현 - Element
class DocumentElement {

    public void accept(Visitor visitor) {
      visitor.visit(this);
    }
}


class...
구현 - Visitor
class SomeVisitor implements Visitor {

    public void visit(Header header) {
      header.get…();
      …
 ...
Visitor의 실행
Document document = getDocument();


TOCVisitor tocVisitor = new TOCVisitor();
document.accept(tocVisitor);
TO...
Visitor의 적용 결과
• 싞규 기능 추가가 쉽다.
 – 새로운 Visitor만 추가하면 됨
 – 기존 코드는 그대로 유지
• 구조의 변화가 적은 경우 유리
• 캡슐화 약화
 – Visitor가 구체 클래스에 커플링...
질문 있으세요?
Upcoming SlideShare
Loading in …5
×

패턴 스퍼티 - Visitor 발표 자료

6,708 views

Published on

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

Published in: Technology
  • Login to see the comments

패턴 스퍼티 - 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. 질문 있으세요?

×