- Today
- Total
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 감성에세이
- swift 코딩테스트
- datastructure
- coding test
- 스위프트디자인패턴
- 프로그래머스 level1
- 코딩테스트
- programmers
- rxswift
- 알고리즘
- 프로그래머스 레벨2
- Algorithm
- swift split
- 스위프트
- 프로그래머스
- sort
- 자료구조
- 디자인 패턴
- 프로그래머스 swift
- 정렬 알고리즘
- Design Pattern
- 정렬
- 코테
- 다트
- 정렬알고리즘
- programmer
- 디자인패턴
- swift 알고리즘
- swift
- dart
Bill Kim's Life...
[디자인패턴] Visitor(방문자) : 객체의 구조와 기능을 분리, 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장 본문
[디자인패턴] Visitor(방문자) : 객체의 구조와 기능을 분리, 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장
billnjoyce 2020. 6. 12. 18:09디자인패턴에의 Visitor(방문자)에 대하여 Swift를 기반으로 하여 살펴봅니다.
#. 구독 대상
- 컴퓨터 및 소프트웨어 공학과 관련자
- 소프트웨어 관련 종사자
- 기타 컴퓨터 공학에 관심이 있으신 분
- 디자인패턴의 개념을 잡고 싶으신 분
- 기타 소프트웨어 개발과 지식에 관심이 있으신 모든 분들
- Swift 언어를 활용하여 디자인패턴을 공부해보고 싶으신 분들
Visitor(방문자)
Visitor(방문자) 패턴은 객체의 구조와 기능을 분리시키는 패턴으로서 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장되어야 할 경우 사용할 수 있는 행위 관련 패턴입니다.
Visitor(방문자) 패턴은 컴포지트 패턴과 연동되어 사용되는 경우가 많습니다.
Visitor(방문자) 패턴의 예로서 파일 탐색기를 구현해볼수 있는데 파일 탐색기는 여기저기 폴더를 돌아다니면서 필요한 파일을 찾아서 특정 저장 공간에 그 파일들이 있는지 저장하였다가 방문이 모두 끝나면 사용자에게 결과를 보여줄 수 있습니다.
바로 탐색기가 여기서 Visitor(방문자) 입니다.
구조
Visitor(방문자) 패턴을 UML로 도식화하면 아래와 같습니다.
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"
}
}
protocol Visitor {
func visitConcreteElementA(element: ConcreteElementA)
func visitConcreteElementB(element: ConcreteElementB)
}
class ConcreteVisitor1: Visitor {
func visitConcreteElementA(element: ConcreteElementA) {
print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor1\n")
}
func visitConcreteElementB(element: ConcreteElementB) {
print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor1\n")
}
}
class ConcreteVisitor2: Visitor {
func visitConcreteElementA(element: ConcreteElementA) {
print(element.exclusiveMethodOfConcreteElementA() + " + ConcreteVisitor2\n")
}
func visitConcreteElementB(element: ConcreteElementB) {
print(element.specialMethodOfConcreteElementB() + " + ConcreteVisitor2\n")
}
}
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
이상으로 Swift를 기반으로하여 Visitor(방문자) 디자인 패턴을 설명하였습니다.
감사합니다.
www.slideshare.net/BillKim8/swift-visitor
github.com/billnjoyce/Lectures/tree/master/src/designpatterns
[참고 자료(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
[6] [소프트웨어/디자인패턴] 방문자 패턴(Visitor Pattern) : https://sticky32.tistory.com/entry/소프트웨어디자인패턴-방문자-패턴Visitor-Pattern
'CS(컴퓨터 과학) > Design Patterns' 카테고리의 다른 글
[디자인패턴] Chain of Responsibility(책임 연쇄) : 연속적인 핸들러를 통한 요청 처리 및 전달 (0) | 2020.06.12 |
---|---|
[디자인패턴] Iterator(반복자) : 컬렉션의 순회 동작을 별도의 반복자 객체로 분리 (0) | 2020.06.12 |
[디자인패턴] Mediator(중재자) : 복잡한 의존 관계와 로직은 캡슐화 (0) | 2020.06.12 |
[디자인패턴] Strategy(전략) : 클래스의 기능을 캡슐화하여 동적으로 변경 (0) | 2020.06.12 |
[디자인패턴] Proxy(프록시) : 가상의 객체를 만들어서 흐름 제어 (0) | 2020.06.12 |