SlideShare uma empresa Scribd logo
1 de 13
최범균 (madvirus@madvirus.net)
  blog: javacan.tistory.com
문서 구조표현
          DocumentElement




DocChar            CompoisteDocumentElement




          LineOfText        Paragraph     Document
목차 생성 기능 추가
                DocumentElement
               +buildTOC()




     DocChar                 CompoisteDocumentElement
+buildTOC()             +buildTOC()




                LineOfText            Header        Document
               +buildTOC()         +buildTOC()    +buildTOC()
XML 변환 기능 추가
                DocumentElement
               +buildTOC()
               +toXML()




     DocChar                 CompoisteDocumentElement
+buildTOC()               +buildTOC()
+toXML()                  +toXML()




                LineOfText              Header      Document
               +buildTOC()           +buildTOC()   +buildTOC()
               +toXML()              +toXML()      +toXML()
또 다른 기능을 추가하려면?
예제 구현의 특징

                                                                 • 서로 다른 기능을 구현한
                DocumentElement
               +buildTOC()
                                                                   코드가 섞여 있음
               +toXML()




                                                                 • 새로운 기능 추가시 모든
     DocChar                 CompoisteDocumentElement
                                                                   클래스에 수정 발생
+buildTOC()               +buildTOC()
+toXML()                  +toXML()




                                                                 • 관련 코드가 여러 노드에
                                                                   분산 구현되어,
                                                                  – 이해 및 유지&변경 어려움
                LineOfText              Header      Document
               +buildTOC()           +buildTOC()   +buildTOC()
               +toXML()              +toXML()      +toXML()
해법은



      특정 기능 관련 코드들을
Visitor라 불리는 별도 클래스로 분리
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)
구현 - 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);
       }
   }
   */
}
구현 - 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);
      }
    }
    …
}
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();
Visitor의 적용 결과
• 싞규 기능 추가가 쉽다.
 – 새로운 Visitor만 추가하면 됨
 – 기존 코드는 그대로 유지
• 구조의 변화가 적은 경우 유리
• 캡슐화 약화
 – Visitor가 구체 클래스에 커플링 됨
질문 있으세요?

Mais conteúdo relacionado

Mais de beom kyun choi

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개beom kyun choi
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나beom kyun choi
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)beom kyun choi
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀beom kyun choi
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료beom kyun choi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개beom kyun choi
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개beom kyun choi
 

Mais de beom kyun choi (20)

옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
옛날 웹 개발자가 잠깐 맛본 Vue.js 소개
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나TDD 발담그기 @ 공감세미나
TDD 발담그기 @ 공감세미나
 
keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)keras 빨리 훑어보기(intro)
keras 빨리 훑어보기(intro)
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀Tensorflow regression 텐서플로우 회귀
Tensorflow regression 텐서플로우 회귀
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
MVP 패턴 소개
MVP 패턴 소개MVP 패턴 소개
MVP 패턴 소개
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
Spring Boot 소개
Spring Boot 소개Spring Boot 소개
Spring Boot 소개
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료ALS WS에 대한 이해 자료
ALS WS에 대한 이해 자료
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
리뷰의 기술 소개
리뷰의 기술 소개리뷰의 기술 소개
리뷰의 기술 소개
 
스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해스프링 시큐리티 구조 이해
스프링 시큐리티 구조 이해
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
자바8 람다식 소개
자바8 람다식 소개자바8 람다식 소개
자바8 람다식 소개
 
Zookeeper 소개
Zookeeper 소개Zookeeper 소개
Zookeeper 소개
 

패턴 스퍼티 - Visitor 발표 자료

  • 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가 구체 클래스에 커플링 됨