Visitor cho phép thêm operation mới vào một cấu trúc object mà không phải sửa class của chính các object đó — tách thuật toán khỏi cấu trúc dữ liệu mà nó xử lý.
ts
interface Visitor {
visitCircle(c: Circle): void
visitRectangle(r: Rectangle): void
}Mỗi shape có accept(visitor: Visitor) để gọi đúng method visit* tương ứng.
Visitor giải quyết tình huống: hierarchy object ổn định (hiếm khi thêm class mới) nhưng phải bổ sung nhiều operation — thêm operation chỉ là thêm một Visitor class, không đụng vào Shape.
Đánh đổi với SOLID: Visitor tuân thủ OCP cho operation nhưng vi phạm OCP cho element — thêm Triangle là phải sửa mọi Visitor.
- Dùng khi: xử lý AST (compiler, code analyzer, transformer) — TypeScript compiler dùng Visitor để duyệt AST; hoặc document model có nhiều định dạng export.
- Không dùng khi: hierarchy thay đổi thường xuyên, hoặc chỉ cần 1-2 operation — polymorphism thường là đủ.