[디자인 패턴] 비지터 패턴

[원본 링크]

비지터 패턴은 클래스의 특정 로직 부분을 비지터라는 별개 클래스에 떠넘겨버리는 패턴이다.

보통 비지터 클래스의 객체를 생성해서 메인 클래스의 메서드 인자로 넘기면, 그에 맞는 비지터 메서드가 메인 클래스의 요소에 접근해서 작업을 수행한다.
이 모습이 마치 방문하는(visit) 것 같아보여서 이렇게 지은듯하다.

말이 장황했는데, 코드부터 보자.

여기 사람의 정보를 가지는 클래스인 Person과, 좌표값을 표현하는 클래스 Point가 있다. image

image

그리고 방문자가 될 비지터의 인터페이스를 선언한다.
이 비지터의 방문 대상은 Point와 Person이 될 것이다. image

image

그리고 비지터를 맞이할 수 있도록 전용 메서드를 정의해준다. 인자로는 당연히 자기자신을 보내준다. image

image

이제 준비작업은 다 끝났다!
원하는대로 비지터 클래스만 구현하면 된다.

단순히 멤버를 출력만 해주는 PrintVisitor를 만들어보겠다. image

image 대충 이렇다.
아까 accept 메서드에서 보낸 this를 받아 "방문"하는 것이다.

그럼 대충 이런식으로 사용이 가능하다. image

image 잘 돌아간다.

근데 이걸 하나만 만들거라면 비지터가 왜 필요하겠는가?
이번엔 객체값을 0 등의 디폴트값으로 초기화시켜버리는 ClearVisitor를 만들어보겠다. image 간단하다. image

image


출력하기 전에 써보면 image

image 이렇게 초기화가 잘 되는걸 볼수있다.

이런 패턴이다.
정해진 특정 타입들에 대한 행동의 추가가 자유롭다.


참조
https://lktprogrammer.tistory.com/58