Visitor는 사전적인 의미로 어떤 장소에 찾아오는 사람이라는 의미를 갖고 있다. 방문자 패턴에서는 데이터 구조와 처리를 분리한다. 데이터 구조 안을 돌아다니는 주체인 방문자를 나타내는 클래스를 준비해서 처리를 맡긴다. 새로운 처리를 추가하고 싶을 땐 새로운 방문자를 만들고 데이터 구조는 방문자를 받아들이면 된다.
방문자 패턴은 개방-폐쇠 원칙을 적용하는 방법 중 한 가지이다.
[확장에 대해 열려있다.]
클래스를 설계할 때, 특별한 이유가 없는 한 확장을 금지해서는 안된다.
[수정에 대해 닫혀있다.]
확장을 할 때 마다 기존의 클래스를 수정하면 안된다.
[Visitor]
데이터 구조 내 각각의 구체적인 요소에 visit메소드를 선언한다.
[ConcreteVisitor]
Visitor 인터페이스를 구현하고, ConcreteAccepter 역할을 처리한다.
[Acceptor]
Acceptor는 Visitor역할이 방문할 곳을 나타낸은 역할을 하고 있다. 방문자를 받아들이는 accept메소드를 선언한다.
[ConcreteAcceptor]
Acceptor 인터페이스를 구현하는 역할을 한다.
[ObjectStructure]
Acceptor역할의 집할을 취급하는 역할을 한다.
연습
위 개념을 토대로 방문자 패턴을 적용하여 마트에서 물건을 사는 사람을 예로 들어보자!
Element.java : Element는 인터페이스로, 방문자를 받아들이기 위한 accept메소드를 가지고 있다.
package com.patterns.VistorPattern;
public interface Element {
public void accept(Visitor visitor);
}
Cart.java :담을 물품을 추가한다. 카트에 추가된 물품의 개수 만큼 반복문을 돌며 해당 요소의 accept메소드를 실행한다.
package com.patterns.VistorPattern;
import java.util.ArrayList;
public class Cart implements Element {
ArrayList<Element> cart = new ArrayList<>();
public Cart() {
cart.add(new Snack());
cart.add(new Milk());
}
@Override
public void accept(Visitor visitor) {
System.out.println("카트가 준비되었습니다.");
visitor.visit(this);
for (Element element : cart) {
element.accept(visitor);
}
}
}
Snack.java
package com.patterns.VistorPattern;
public class Snack implements Element {
@Override
public void accept(Visitor visitor) {
System.out.println("과자가 준비되었습니다.");
visitor.visit(this);
}
}
Milk.java
package com.patterns.VistorPattern;
public class Milk implements Element {
@Override
public void accept(Visitor visitor) {
System.out.println("우유가 준비되었습니다.");
visitor.visit(this);
}
}
Visitor.java : 인터페이스 정의
package com.patterns.VistorPattern;
public interface Visitor {
public void visit(Cart cart);
public void visit(Snack snack);
public void visit(Milk milk);
}
Shopper.java : Visitor 의 구현체
package com.patterns.VistorPattern;
public class Shopper implements Visitor {
@Override
public void visit(Cart cart) {
System.out.println("카트를 사용합니다.");
}
@Override
public void visit(Snack snack) {
System.out.println("과자를 카트에 넣습니다.");
}
@Override
public void visit(Milk milk) {
System.out.println("우유를 카트에 넣습니다.");
}
}
테스트
package com.patterns.VistorPattern;
public class Client {
public static void main(String args[]) {
Shopper shopper = new Shopper();
Cart cart = new Cart();
cart.accept(shopper);
}
}
정리
- 정리하자면 방문자 패턴은, 기존 클래스 필드 정보를 유지하면서 새로운 연산을 추가하는 방식이다!
참고
비지터 패턴 - 위키 백과
방문자 패턴(Visitor Pattern)
[디자인패턴] 방문자패턴(Visitor Pattern)
Visitor는 사전적인 의미로 어떤 장소에 찾아오는 사람이라는 의미를 갖고 있다. 방문자 패턴에서는 데이터 구조와 처리를 분리한다. 데이터 구조 안을 돌아다니는 주체인 방문자를 나타내는 클
velog.io
'IT > 다자인 패턴' 카테고리의 다른 글
3.11 커맨드 패턴(Command) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.15 |
---|---|
3.10 인터프리터 패턴(Interpreter Pattern) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
3.8 메멘토 패턴 (Memento Pattern) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
3.7 책임연쇄 패턴(Chain of responsibility) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |
3.6 상태(State) .....행동 패턴(Behavioral Pattern) 중 (0) | 2022.08.14 |