250x250
반응형
05-11 19:27
Today
Total
«   2024/05   »
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
Notice
Recent Posts
Recent Comments
Link
Archives
관리 메뉴

Bill Kim's Life...

[디자인패턴] Visitor(방문자) : 객체의 구조와 기능을 분리, 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장 본문

CS(컴퓨터 과학)/Design Patterns

[디자인패턴] Visitor(방문자) : 객체의 구조와 기능을 분리, 구조는 변하지 않으면서 기능을 쉽게 추가하거나 확장

billnjoyce 2020. 6. 12. 18:09
728x90
반응형
디자인패턴에의 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

 

[Swift] Visitor

Swift 소스 코드를 통한 Visitor 디자인패턴에 관한 강의 자료입니다.

www.slideshare.net

github.com/billnjoyce/Lectures/tree/master/src/designpatterns

 

billnjoyce/Lectures

Contribute to billnjoyce/Lectures development by creating an account on GitHub.

github.com

 

 

 


[참고 자료(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

728x90
반응형
Comments