certain-design-patterns/visitor.py

35 lines
1.5 KiB
Python
Raw Normal View History

2025-02-07 12:10:20 +03:00
from abc import ABC, abstractmethod
# Интерфейс для элементов, которые могут быть посещены
class Element(ABC):
@abstractmethod
def accept(self, visitor): pass
# Конкретные элементы
class Book(Element):
def __init__(self, title, author):
self.title = title
self.author = author
def accept(self, visitor): visitor.visit_book(self)
class Movie(Element):
def __init__(self, title, director):
self.title = title
self.director = director
def accept(self, visitor): visitor.visit_movie(self)
# Интерфейс для посетителей
class Visitor(ABC):
@abstractmethod
def visit_book(self, book): pass
@abstractmethod
def visit_movie(self, movie): pass
# Конкретный посетитель
class ConcreteVisitor(Visitor):
def visit_book(self, book): print(f"Книга: {book.title}, Автор: {book.author}")
def visit_movie(self, movie): print(f"Фильм: {movie.title}, Режиссер: {movie.director}")
# Создаем элементы
book1, book2, movie1 = Book("1984", "Джордж Оруэлл"), Book("Мастер и Маргарита", "Михаил Булгаков"), \
Movie("Начало", "Кристофер Нолан")
# Создаем посетителя
print_visitor = ConcreteVisitor()
# Посещаем элементы
for element in [book1, book2, movie1]: element.accept(print_visitor)