35 lines
1.5 KiB
Python
35 lines
1.5 KiB
Python
|
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)
|