방문자 패턴은, 개체를 구성하는 요소를 분리시키고 요소가 해야할 작업들을 메서드로 제공하는 패턴을 말한다.
Element : 개체로부터 분리시킨 요소
Visitor : 개체로부터 분리된 Element가 방문하는 개체
Element 클래스와 Visitor 클래스는 인터페이스이다.
Visitor에 해당하는 클래스는 Element를 상속받는 개체가 수행할 수 있는 Accept 메서드를 정의해야 한다.
그리고 Visitor를 상속받는 클래스들은 Accept 메서드로 전달받은 Element 클래스가 하려는 작업들을 구현해야한다.
때문에 Visitor를 상속받는 클래스들은 Element 클래스에 대부분의 정보를 제공해야 하기 때문에 정보 은닉이 되지 않는 단점을 가진다.
Element 클래스는 Visitor를 상속받는 클래스들 만큼의 메서드를 정의해야한다.
Visitor를 상속 받는 클래스마다 해야하는 작업이 모두 다르고, 인자로 전달받는 개체는 Visitor가 아닌 서브 클래스이기 때문이다.
Visitor 클래스와 Element 클래스는 서로의 클래스를 인자로 전달받기 때문에 전방 선언을 통해 구현된다.
Visitor를 상속받은 VisitorSub1과 VisitorSub2의 Accept 메서드에서는 자신의 클래스에 해당하는 메서드를 구현하면 된다.
VisitorSub1 → Element::VisitSub1(this)
VisitorSub2 → Element::VisitSub2(this)
ElementSub 클래스에서는 VisitorSub 클래스들에서 수행할 작업들을 구현하면 된다.
위의 코드에서 Planet 클래스는 Visitor에 해당하는 클래스이다.
전방 선언으로 정의해둔 Resident 클래스가 Element에 해당한다.
Planet의 서브 클래스들 내에 Resident 클래스에서 수행할 구체적인 작업들을 미리 구현해둔 것을 알 수 있다.
Resident 클래스 내에는 각 각의 Planet의 서브 클래스 내에서 수행할 수 있도록 인터페이스에 정의해두었다.
Resident의 서브 클래스 내에서 전달받는 인자 내에 미리 구현해둔 함수들을 사용하여 구현하면 된다.
'프로그래밍 끄적 > 디자인 패턴 (Design Pattern)' 카테고리의 다른 글
[디자인 패턴] 템플릿 메서드 패턴 (Template Method Pattern) (0) | 2018.09.08 |
---|---|
[디자인 패턴] 전략 패턴 (Strategy Pattern) (0) | 2018.09.06 |
[디자인 패턴] 상태 패턴 (State Pattern) (0) | 2018.09.04 |
[디자인 패턴] 감시자 패턴 (Observer Pattern) (0) | 2018.09.03 |
[디자인 패턴] 메멘토 패턴 (Memento Pattern) (0) | 2018.08.25 |