방문자 패턴(Visitor Pattern)은 객체의 데이터 구조와 그 구조를 처리하는 연산(동작)을 완벽하게 분리하는 행위 패턴입니다.
대형 쇼핑몰 장바구니에 '가전제품', '신선식품', '주류'가 들어있다고 해봅시다. 만약 '할인액 계산', '세금 계산', '배송비 계산' 로직을 각 상품 클래스 안에 넣으면 클래스가 비대해집니다. 방문자 패턴은 상품(데이터 구조)은 accept()라는 문만 열어두고, 별도의 방문자 클래스(TaxVisitor, DiscountVisitor)가 문을 열고 들어가 알아서 로직을 처리하게 만듭니다. OCP(개방 폐쇄 원칙)를 극대화합니다.
📐 Visitor Pattern UML
방문자 패턴은 객체 구조를 변경하지 않고도 객체들에 대해 새로운 연산을 수행할 수 있게 합니다.
class ConcreteElementA {
accept(visitor) { visitor.visitElementA(this); }
operationA() { return "ElementA Operation"; }
}
class ConcreteElementB {
accept(visitor) { visitor.visitElementB(this); }
operationB() { return "ElementB Operation"; }
}
class ConcreteVisitor1 {
visitElementA(element) { console.log(`Visitor1: ${element.operationA()}`); }
visitElementB(element) { console.log(`Visitor1: ${element.operationB()}`); }
}
const elements = [new ConcreteElementA(), new ConcreteElementB()];
const visitor1 = new ConcreteVisitor1();
for (const el of elements) {
el.accept(visitor1);
}