SlideShare a Scribd company logo
1 of 11
Download to read offline
SWIFT
Visitor
Bill Kim(김정훈) | ibillkim@gmail.com
목차
•Visitor
•Structure
•Implementation
•References
Visitor
Visitor(방문자) 패턴은 객체의 구조와 기능을 분리시키는 패턴으로
서 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장되어야 할
경우 사용할 수 있는 행위 관련 패턴입니다.
Visitor(방문자) 패턴은 컴포지트 패턴과 연동되어 사용되는 경우
가 많습니다.
Visitor(방문자) 패턴의 예로서 파일 탐색기를 구현해볼수 있는데
파일 탐색기는 여기저기 폴더를 돌아다니면서 필요한 파일을 찾아
서 특정 저장 공간에 그 파일들이 있는지 저장하였다가 방문이 모
두 끝나면 사용자에게 결과를 보여줄 수 있습니다.
바로 탐색기가 여기서 Visitor(방문자) 입니다.
Structure
Visitor 패턴을 UML로 도식화하면 아래와 같습니다.
Structure
Element : Visitor 객체를 수용하여 특정 메소드에 방문할 수 있도
록 하는 메소드를 정의하는 추상 클래스 객체
ConcreteElement : Element 객체를 상속받아 방문자가 방문할
수 있는 메소드에 대한 구현을 실제로 하는 객체
Visitor : 각 ConcreteElement 객체에 대해서 방문할 수 있는 방
문자 기본 클래스로서 방문을 할 객체들에 대한 기본 인터페이스 메
소드에 대한 정의를 하는 객체
ConcreteVisitor : Visitor 객체를 상속받아 방문하게 되는 객체
들의 같은 인터페이스 메소드에 대한 행동을 재구현할 수 있게 해주
는 서브 클래스 객체
Implementation
구체적인 구현에 대해서 소스 코드를 통하여 살펴봅니다.
protocol Element {
func accept(_ visitor: Visitor)
}
class ConcreteElementA : Element {
func accept(_ visitor: Visitor) {
visitor.visitConcreteElementA(element: self)
}
func exclusiveMethodOfConcreteElementA() -> String {
return "A"
}
}
class ConcreteElementB: Element {
func accept(_ visitor: Visitor) {
visitor.visitConcreteElementB(element: self)
}
func specialMethodOfConcreteElementB() -> String {
return "B"
}
}
Implementation
protocol Visitor {
func visitConcreteElementA(element: ConcreteElementA)
func visitConcreteElementB(element: ConcreteElementB)
}
class ConcreteVisitor1: Visitor {
func visitConcreteElementA(element: ConcreteElementA) {
print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor1n")
}
func visitConcreteElementB(element: ConcreteElementB) {
print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor1n")
}
}
class ConcreteVisitor2: Visitor {
func visitConcreteElementA(element: ConcreteElementA) {
print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor2n")
}
func visitConcreteElementB(element: ConcreteElementB) {
print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor2n")
}
}
Implementation
func visit(elements: [Element], visitor: Visitor) {
/* for element in elements
{
element.accept(visitor)
}*/
elements.forEach({ $0.accept(visitor) })
}
let elements: [Element] = [ConcreteElementA(), ConcreteElementB()]
let visitor1 = ConcreteVisitor1()
visit(elements: elements, visitor: visitor1)
// A + ConcreteVisitor1
// B + ConcreteVisitor1
let visitor2 = ConcreteVisitor2()
visit(elements: elements, visitor: visitor2)
// A + ConcreteVisitor2
// B + ConcreteVisitor2
References
[1] [디자인 패턴] 13. 방문자 패턴 ( Visitor Pattern ) :
https://itchipmunk.tistory.com/373
[2] 방문자 패턴(Visitor Pattern) : https://
copynull.tistory.com/146
[3] Visitor in Swift : https://refactoring.guru/design-
patterns/visitor/swift/example
[4] ⑬ 디자인 패턴(Design Pattern) - Visitor : https://
gorakgarak.tistory.com/466
[5] c++ - 방문자 디자인 패턴 및 다중 계층 클래스 계층 :
https://www.python2.net/questions-439189.htm
References
[6] [소프트웨어/디자인패턴] 방문자 패턴(Visitor Pattern) :
https://sticky32.tistory.com/entry/소프트웨어디자인패턴-
방문자-패턴Visitor-Pattern
Thank you!

More Related Content

More from Bill Kim

[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection SortBill Kim
 
[Algorithm] Merge Sort
[Algorithm] Merge Sort[Algorithm] Merge Sort
[Algorithm] Merge SortBill Kim
 
[Algorithm] Insertion Sort
[Algorithm] Insertion Sort[Algorithm] Insertion Sort
[Algorithm] Insertion SortBill Kim
 
[Algorithm] Bubble Sort
[Algorithm] Bubble Sort[Algorithm] Bubble Sort
[Algorithm] Bubble SortBill Kim
 
[Algorithm] Binary Search
[Algorithm] Binary Search[Algorithm] Binary Search
[Algorithm] Binary SearchBill Kim
 
[Algorithm] Recursive(재귀)
[Algorithm] Recursive(재귀)[Algorithm] Recursive(재귀)
[Algorithm] Recursive(재귀)Bill Kim
 
[Swift] Data Structure - AVL
[Swift] Data Structure - AVL[Swift] Data Structure - AVL
[Swift] Data Structure - AVLBill Kim
 
[Swift] Data Structure - Binary Search Tree
[Swift] Data Structure - Binary Search Tree[Swift] Data Structure - Binary Search Tree
[Swift] Data Structure - Binary Search TreeBill Kim
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)Bill Kim
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)Bill Kim
 
[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary TreeBill Kim
 
[Swift] Data Structure - Tree
[Swift] Data Structure - Tree[Swift] Data Structure - Tree
[Swift] Data Structure - TreeBill Kim
 
[Swift] Data Structure - Graph
[Swift] Data Structure - Graph[Swift] Data Structure - Graph
[Swift] Data Structure - GraphBill Kim
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - HeapBill Kim
 
[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue[Swift] Data Structure - Dequeue
[Swift] Data Structure - DequeueBill Kim
 
[Swift] Data Structure - Stack
[Swift] Data Structure - Stack[Swift] Data Structure - Stack
[Swift] Data Structure - StackBill Kim
 
[Swift] Data Structure - Queue
[Swift] Data Structure - Queue[Swift] Data Structure - Queue
[Swift] Data Structure - QueueBill Kim
 
[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked ListBill Kim
 
[Swift] Data Structure Introduction
[Swift] Data Structure Introduction[Swift] Data Structure Introduction
[Swift] Data Structure IntroductionBill Kim
 
[Swift] Data Structure - Array
[Swift] Data Structure - Array[Swift] Data Structure - Array
[Swift] Data Structure - ArrayBill Kim
 

More from Bill Kim (20)

[Algorithm] Selection Sort
[Algorithm] Selection Sort[Algorithm] Selection Sort
[Algorithm] Selection Sort
 
[Algorithm] Merge Sort
[Algorithm] Merge Sort[Algorithm] Merge Sort
[Algorithm] Merge Sort
 
[Algorithm] Insertion Sort
[Algorithm] Insertion Sort[Algorithm] Insertion Sort
[Algorithm] Insertion Sort
 
[Algorithm] Bubble Sort
[Algorithm] Bubble Sort[Algorithm] Bubble Sort
[Algorithm] Bubble Sort
 
[Algorithm] Binary Search
[Algorithm] Binary Search[Algorithm] Binary Search
[Algorithm] Binary Search
 
[Algorithm] Recursive(재귀)
[Algorithm] Recursive(재귀)[Algorithm] Recursive(재귀)
[Algorithm] Recursive(재귀)
 
[Swift] Data Structure - AVL
[Swift] Data Structure - AVL[Swift] Data Structure - AVL
[Swift] Data Structure - AVL
 
[Swift] Data Structure - Binary Search Tree
[Swift] Data Structure - Binary Search Tree[Swift] Data Structure - Binary Search Tree
[Swift] Data Structure - Binary Search Tree
 
[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)[Swift] Data Structure - Graph(BFS)
[Swift] Data Structure - Graph(BFS)
 
[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)[Swift] Data Structure - Graph(DFS)
[Swift] Data Structure - Graph(DFS)
 
[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree[Swift] Data Structure - Binary Tree
[Swift] Data Structure - Binary Tree
 
[Swift] Data Structure - Tree
[Swift] Data Structure - Tree[Swift] Data Structure - Tree
[Swift] Data Structure - Tree
 
[Swift] Data Structure - Graph
[Swift] Data Structure - Graph[Swift] Data Structure - Graph
[Swift] Data Structure - Graph
 
[Swift] Data Structure - Heap
[Swift] Data Structure - Heap[Swift] Data Structure - Heap
[Swift] Data Structure - Heap
 
[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue[Swift] Data Structure - Dequeue
[Swift] Data Structure - Dequeue
 
[Swift] Data Structure - Stack
[Swift] Data Structure - Stack[Swift] Data Structure - Stack
[Swift] Data Structure - Stack
 
[Swift] Data Structure - Queue
[Swift] Data Structure - Queue[Swift] Data Structure - Queue
[Swift] Data Structure - Queue
 
[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List[Swift] Data Structure - Linked List
[Swift] Data Structure - Linked List
 
[Swift] Data Structure Introduction
[Swift] Data Structure Introduction[Swift] Data Structure Introduction
[Swift] Data Structure Introduction
 
[Swift] Data Structure - Array
[Swift] Data Structure - Array[Swift] Data Structure - Array
[Swift] Data Structure - Array
 

Recently uploaded

왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복
왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복
왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복Kyubok Cho
 
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)snsdl0905
 
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdfSeongwon Kim
 
2024_Puzners_work_introduction_slide_content
2024_Puzners_work_introduction_slide_content2024_Puzners_work_introduction_slide_content
2024_Puzners_work_introduction_slide_contentalskjde0129
 
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한 인천대 챗봇
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한  인천대 챗봇D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한  인천대 챗봇
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한 인천대 챗봇hjk580018
 
2024_INU_graduation_presentation_data.pptx
2024_INU_graduation_presentation_data.pptx2024_INU_graduation_presentation_data.pptx
2024_INU_graduation_presentation_data.pptxssuser3a8816
 
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법ultrasuperrok
 

Recently uploaded (7)

왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복
왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복
왜 학교에서의 스마트기기 활용이 학생의 대인관계에 영향을 미치는가? 조규복
 
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)
인천대학교 졸업작품 발표 피피티 - 축제 올인원(All-In-One)
 
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf
현대 학교의 체육관 혁신 방향과 과제 그리고 사례들을 정리한 자료.pdf
 
2024_Puzners_work_introduction_slide_content
2024_Puzners_work_introduction_slide_content2024_Puzners_work_introduction_slide_content
2024_Puzners_work_introduction_slide_content
 
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한 인천대 챗봇
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한  인천대 챗봇D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한  인천대 챗봇
D그룹 졸업작품 1번. 자연어 처리(NLP)를 이용한 인천대 챗봇
 
2024_INU_graduation_presentation_data.pptx
2024_INU_graduation_presentation_data.pptx2024_INU_graduation_presentation_data.pptx
2024_INU_graduation_presentation_data.pptx
 
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법
코딩테스트 합격자 되기 C++ 04_05장_코딩 테스트를 할때 반드시 알아야할 문법
 

[Swift] Visitor

  • 3. Visitor Visitor(방문자) 패턴은 객체의 구조와 기능을 분리시키는 패턴으로 서 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장되어야 할 경우 사용할 수 있는 행위 관련 패턴입니다. Visitor(방문자) 패턴은 컴포지트 패턴과 연동되어 사용되는 경우 가 많습니다. Visitor(방문자) 패턴의 예로서 파일 탐색기를 구현해볼수 있는데 파일 탐색기는 여기저기 폴더를 돌아다니면서 필요한 파일을 찾아 서 특정 저장 공간에 그 파일들이 있는지 저장하였다가 방문이 모 두 끝나면 사용자에게 결과를 보여줄 수 있습니다. 바로 탐색기가 여기서 Visitor(방문자) 입니다.
  • 4. Structure Visitor 패턴을 UML로 도식화하면 아래와 같습니다.
  • 5. Structure Element : Visitor 객체를 수용하여 특정 메소드에 방문할 수 있도 록 하는 메소드를 정의하는 추상 클래스 객체 ConcreteElement : Element 객체를 상속받아 방문자가 방문할 수 있는 메소드에 대한 구현을 실제로 하는 객체 Visitor : 각 ConcreteElement 객체에 대해서 방문할 수 있는 방 문자 기본 클래스로서 방문을 할 객체들에 대한 기본 인터페이스 메 소드에 대한 정의를 하는 객체 ConcreteVisitor : Visitor 객체를 상속받아 방문하게 되는 객체 들의 같은 인터페이스 메소드에 대한 행동을 재구현할 수 있게 해주 는 서브 클래스 객체
  • 6. Implementation 구체적인 구현에 대해서 소스 코드를 통하여 살펴봅니다. protocol Element { func accept(_ visitor: Visitor) } class ConcreteElementA : Element { func accept(_ visitor: Visitor) { visitor.visitConcreteElementA(element: self) } func exclusiveMethodOfConcreteElementA() -> String { return "A" } } class ConcreteElementB: Element { func accept(_ visitor: Visitor) { visitor.visitConcreteElementB(element: self) } func specialMethodOfConcreteElementB() -> String { return "B" } }
  • 7. Implementation protocol Visitor { func visitConcreteElementA(element: ConcreteElementA) func visitConcreteElementB(element: ConcreteElementB) } class ConcreteVisitor1: Visitor { func visitConcreteElementA(element: ConcreteElementA) { print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor1n") } func visitConcreteElementB(element: ConcreteElementB) { print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor1n") } } class ConcreteVisitor2: Visitor { func visitConcreteElementA(element: ConcreteElementA) { print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor2n") } func visitConcreteElementB(element: ConcreteElementB) { print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor2n") } }
  • 8. Implementation func visit(elements: [Element], visitor: Visitor) { /* for element in elements { element.accept(visitor) }*/ elements.forEach({ $0.accept(visitor) }) } let elements: [Element] = [ConcreteElementA(), ConcreteElementB()] let visitor1 = ConcreteVisitor1() visit(elements: elements, visitor: visitor1) // A + ConcreteVisitor1 // B + ConcreteVisitor1 let visitor2 = ConcreteVisitor2() visit(elements: elements, visitor: visitor2) // A + ConcreteVisitor2 // B + ConcreteVisitor2
  • 9. References [1] [디자인 패턴] 13. 방문자 패턴 ( Visitor Pattern ) : https://itchipmunk.tistory.com/373 [2] 방문자 패턴(Visitor Pattern) : https:// copynull.tistory.com/146 [3] Visitor in Swift : https://refactoring.guru/design- patterns/visitor/swift/example [4] ⑬ 디자인 패턴(Design Pattern) - Visitor : https:// gorakgarak.tistory.com/466 [5] c++ - 방문자 디자인 패턴 및 다중 계층 클래스 계층 : https://www.python2.net/questions-439189.htm
  • 10. References [6] [소프트웨어/디자인패턴] 방문자 패턴(Visitor Pattern) : https://sticky32.tistory.com/entry/소프트웨어디자인패턴- 방문자-패턴Visitor-Pattern