Что такое паттерн Посетитель (Visitor)?
Этот вопрос проверяет знание паттерна Посетитель и его применения для разделения логики и структуры объекта.
Короткий ответ
Паттерн Посетитель позволяет добавлять новые операции к объектам без изменения их классов. Это достигается через внешний класс "посетитель", который реализует логику, применимую к объектам разных типов.
Длинный ответ
Паттерн Посетитель используется, когда нужно выполнять разные действия над объектами, принадлежащими к иерархии классов, и при этом не изменять их код. Основная идея — переместить логику работы с объектами из их самих в класс "посетитель".
Пример из реальной жизни:
Представьте музей, где гид (посетитель) проходит через разные залы (объекты) и рассказывает про экспонаты. Каждый зал остаётся неизменным, но гид адаптирует свой рассказ для каждого зала.
Реализация в Python:
class Visitor:
def visit_circle(self, circle):
print(f"Вычисление площади круга с радиусом {circle.radius}")
def visit_rectangle(self, rectangle):
print(f"Вычисление площади прямоугольника {rectangle.width}x{rectangle.height}")
class Shape:
def accept(self, visitor):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def accept(self, visitor):
visitor.visit_circle(self)
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def accept(self, visitor):
visitor.visit_rectangle(self)
visitor = Visitor()
circle = Circle(10)
rectangle = Rectangle(5, 10)
circle.accept(visitor)
rectangle.accept(visitor)
Когда использовать:
- Если часто нужно добавлять новые операции к объектам.
- Когда изменение классов объектов нежелательно (например, сторонний код).