비지터 패턴으로 플레이어 직업 분화
비지터 패턴으로 발사체 구분
알고리즘을 객체 구조에서 분리시키는 디자인 패턴
비지터 인터페이스(Visitor Interface)
구상 비지터(Concrete Visitor)
요소 인터페이스(Element Interface)
구상 요소(Concrete Element)
클라이언트(Client)
복잡한 객체 구조(예: 객체 트리)의 모든 요소에 대해 작업을 수행해야 할 때 사용
비지터 패턴을 사용하여 보조 행동들의 비즈니스 로직을 정리
행동이 클래스 계층구조의 일부 클래스들에서만 의미가 있고 다른 클래스들에서는 의미가 없을 때 사용
비지터 패턴은 커맨드 패턴의 강력한 버전으로 취급할 수 있다. 비지터 패턴의 객체들은 다른 클래스들의 다양한 객체에 대한 작업을 실행할 수 있다.
비지터 패턴을 사용하여 복합체 패턴 트리 전체를 대상으로 작업을 수행할 수 있다.
비지터 패턴과 반복자 패턴을 함께 사용해 복잡한 데이터 구조를 순회하여 해당 구조의 요소들의 클래스들이 모두 다르더라도 이러한 요소들에 대해 어떤 작업을 실행할 수 있다.
방문자를 받아들이기 위한 accept메소드를 가지고 있다
public interface Element {
public void accept(Visitor visitor);
}
Cart생성자에서, 담을 물품을 추가. 카트에 추가된 물품의 개수 만큼 반복문을 돌며 해당 요소의 accept메소드를 실행
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
public class Snack implements Element {
@Override
public void accept(Visitor visitor) {
System.out.println("과자가 준비되었습니다.");
visitor.visit(this);
}
}
// Milk
public class Milk implements Element {
@Override
public void accept(Visitor visitor) {
System.out.println("우유가 준비되었습니다.");
visitor.visit(this);
}
}
// Visitor
public interface Visitor {
public void visit(Cart cart);
public void visit(Snack snack);
public void visit(Milk milk);
}
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("우유를 카트에 넣습니다.");
}
}
public class Client {
public static void main(String args[]) {
Shopper shopper = new Shopper();
Cart cart = new Cart();
cart.accept(shopper);
}
}