master
serr 2025-02-07 12:10:20 +03:00
commit ca095408cf
15 changed files with 661 additions and 0 deletions

28
adapter.py Normal file
View File

@ -0,0 +1,28 @@
from abc import ABC, abstractmethod
class ITransport(ABC): # Интерфейс для транспорта
@abstractmethod
def drive(self): pass
###
class Auto(ITransport): # класс машины с реализацией метода drive
def drive(self): print("Машина едет по дороге")
###
class Driver: # Класс водителя
def travel(self, transport: ITransport): transport.drive()
###
class IAnimal(ABC): # Интерфейс животного
@abstractmethod
def move(self): pass
###
class Camel(IAnimal): # Класс верблюда
def move(self): print("Верблюд идет по пескам пустыни")
###
class CamelToTransportAdapter(ITransport): # Адаптер от Camel к ITransport
def __init__(self, camel: Camel): self.camel = camel
def drive(self): self.camel.move()
driver = Driver() # Создаю путешественника
auto = Auto() # Создаю машину
driver.travel(auto) # Отправляемся в путешествие на машине (использует метод drive у транспорта)
camel = Camel() # Встретились пески, надо использовать верблюда
camel_transport = CamelToTransportAdapter(camel) # Используем адаптер, по другому реализующий метод drive
driver.travel(camel_transport) # Продолжаем путь по пескам пустыни на верблюде

37
bridge.py Normal file
View File

@ -0,0 +1,37 @@
from abc import ABC, abstractmethod
class Color(ABC): # реализация (задает общий интерфейс для всех реализаций)
@abstractmethod
def fillColor(self): pass
class BlackColor(Color): # конкретная реализация
def fillColor(self): print("Filling in black color")
class GreenColor(Color): # конкретная реализация
def fillColor(self): print("Filling in green color")
class RedColor(Color): # конкретная реализация
def fillColor(self): print("Filling in red color")
class Shape(ABC): # абстракция
def __init__(self, color): self.color = color # собственно, мост
@abstractmethod
def draw(self): pass
class Rectangle(Shape): # клиент (бизнес логика)
def __init__(self, color): super().__init__(color)
def draw(self):
print("Drawing rectangle")
self.color.fillColor()
class Triangle(Shape): # клиент (бизнес логика)
def __init__(self, color): super().__init__(color)
def draw(self):
print("Drawing triangle")
self.color.fillColor()
# Пример использования
black, green, red = BlackColor(), GreenColor(), RedColor() # МОСТ ПОЗВОЛИЛ ОТДЕЛЬНО СОЗДАТЬ РЕАЛИЗАЦИИ
rectangle, triangle = Rectangle(black), Triangle(green)
rectangle.draw()
triangle.draw()

122
builder.py Normal file
View File

@ -0,0 +1,122 @@
from abc import ABC, abstractmethod
class Car:
def __init__(self):
self.seats = None
self.engine = None
self.trip_computer = None
self.gps = None
def __str__(self):
return (f"Car with {self.seats} seats, {self.engine} engine, "
f"trip computer: {self.trip_computer}, GPS: {self.gps}")
class CarManual:
def __init__(self):
self.seats = None
self.engine = None
self.trip_computer = None
self.gps = None
def __str__(self):
return (f"Car manual:\nSeats: {self.seats}\nEngine: {self.engine}\n"
f"trip computer: {self.trip_computer}\nGPS: {self.gps}")
class Builder(ABC):
@abstractmethod
def reset(self):
pass
@abstractmethod
def set_seats(self, number):
pass
@abstractmethod
def set_engine(self, engine_type):
pass
@abstractmethod
def set_trip_computer(self, has_trip_computer):
pass
@abstractmethod
def set_gps(self, has_gps):
pass
@abstractmethod
def get_result(self):
pass
class CarBuilder(Builder):
def __init__(self):
self.reset()
def reset(self):
self._car = Car()
return self
def set_seats(self, number):
self._car.seats = number
return self
def set_engine(self, engine_type):
self._car.engine = engine_type
return self
def set_trip_computer(self, has_trip_computer):
self._car.trip_computer = has_trip_computer
return self
def set_gps(self, has_gps):
self._car.gps = has_gps
return self
def get_result(self):
car = self._car
self.reset()
return car
class CarManualBuilder(Builder):
def __init__(self):
self.reset()
def reset(self):
self._manual = CarManual()
return self
def set_seats(self, number):
self._manual.seats = f"{number} seats"
return self
def set_engine(self, engine_type):
self._manual.engine = f"engine type: {engine_type}"
return self
def set_trip_computer(self, has_trip_computer):
self._manual.trip_computer = "Equipped with a trip computer" if has_trip_computer else "No trip computer"
return self
def set_gps(self, has_gps):
self._manual.gps = "includes GPS navigation" if has_gps else "No GPS navigation"
return self
def get_result(self):
manual = self._manual
self.reset()
return manual
class Director:
def __init__(self, builder: Builder):
self._builder = builder
def set_builder(self, builder: Builder):
self._builder = builder
def construct_sport_car(self):
self._builder.reset()
self._builder.set_seats(2)
self._builder.set_engine("V8")
self._builder.set_trip_computer(True)
self._builder.set_gps(True)
def construct_suv(self):
self._builder.reset()
self._builder.set_seats(7)
self._builder.set_engine("V6")
self._builder.set_trip_computer(True)
self._builder.set_gps(False)
director = Director(CarBuilder())
director.construct_sport_car()
print(director._builder.get_result())
director.set_builder(CarManualBuilder())
director.construct_sport_car()
print(director._builder.get_result())
director.set_builder(CarBuilder())
director.construct_suv()
print(director._builder.get_result())
director.set_builder(CarManualBuilder())
director.construct_suv()
print(director._builder.get_result())

32
chain.py Normal file
View File

@ -0,0 +1,32 @@
from abc import ABC, abstractmethod
class Handler(ABC):
def __init__(self, successor=None): self.successor = successor # Следующий обработчик в цепи
@abstractmethod
def handle_request(self, request): pass
class ConcreteHandlerA(Handler):
def handle_request(self, request):
if request == "A":
return f"Handler A handled the request: {request}"
elif self.successor:
return self.successor.handle_request(request)
return "Request not handled"
class ConcreteHandlerB(Handler):
def handle_request(self, request):
if request == "B":
return f"Handler B handled the request: {request}"
elif self.successor:
return self.successor.handle_request(request)
return "Request not handled"
class ConcreteHandlerC(Handler):
def handle_request(self, request):
if request == "C": return f"Handler C handled the request: {request}"
elif self.successor: return self.successor.handle_request(request)
return "Request not handled"
handler_chain = ConcreteHandlerA(ConcreteHandlerB(ConcreteHandlerC())) # Цепочка обработчиков
requests = ["A", "B", "C", "D"] # Примеры запросов
for req in requests: print(handler_chain.handle_request(req))

37
command.py Normal file
View File

@ -0,0 +1,37 @@
from abc import ABC, abstractmethod
class Command(ABC):
@abstractmethod
def execute(self): pass
# Команда для включения света
class LightOnCommand(Command):
def __init__(self, light): self.light = light
def execute(self): self.light.turn_on()
# Команда для выключения света
class LightOffCommand(Command):
def __init__(self, light): self.light = light
def execute(self): self.light.turn_off()
# Класс, представляющий источник света (получатель комманд)
class Light:
def turn_on(self): print("Свет включен.")
def turn_off(self): print("Свет выключен.")
# Класс-отправитель (Invoker), который инициирует команды
class RemoteControl:
def __init__(self): self.commands = []
def set_command(self, command): self.commands.append(command)
def press_button(self):
if self.commands:
command = self.commands.pop(0) # Извлекаем и выполняем первую команду
command.execute()
else: print("Нет доступных команд.")
light = Light()
light_on, light_off = LightOnCommand(light), LightOffCommand(light) # Создаем команды
# Создаем пульт управления (invoker, который инициирует команды)
remote = RemoteControl()
# Устанавливаем команды
remote.set_command(light_on)
remote.set_command(light_off)
# Выполнение установленных команд
remote.press_button() # Включает свет
remote.press_button() # Выключает свет
remote.press_button() # Нет доступных команд

54
composite.py Normal file
View File

@ -0,0 +1,54 @@
class Component:
"""Абстрактный класс для всех компонентов."""
def operation(self):
raise NotImplementedError("Метод operation должен быть переопределен.")
class Leaf(Component):
"""Листовой элемент, который не имеет подкомпонентов."""
def __init__(self, name):
self.name = name
def operation(self):
return f"Leaf: {self.name}"
class Composite(Component):
"""Композитный элемент, который может содержать другие компоненты."""
def __init__(self, name):
self.name = name
self.children = []
def add(self, component):
self.children.append(component)
def remove(self, component):
self.children.remove(component)
def operation(self):
results = [f"Composite: {self.name}"]
for child in self.children:
results.append(child.operation())
return "\n".join(results)
# Пример использования
if __name__ == "__main__":
# Создаем листья
leaf1 = Leaf("Leaf 1")
leaf2 = Leaf("Leaf 2")
leaf3 = Leaf("Leaf 3")
# Создаем композиты
composite1 = Composite("Composite 1")
composite2 = Composite("Composite 2")
# Добавляем листья в композиты
composite1.add(leaf1)
composite1.add(leaf2)
composite2.add(leaf3)
composite2.add(composite1) # Вложение composite1 в composite2
# Выполняем операции
print(composite2.operation())

40
decorator.py Normal file
View File

@ -0,0 +1,40 @@
from abc import ABC, abstractmethod
class IBeverage(ABC):
@abstractmethod
def getDescriprion(self) -> str: pass
@abstractmethod
def getCost(self) -> int: pass
class Coffe(IBeverage):
def getDescriprion(self) -> str: return "Coffee"
def getCost(self) -> int: return 100
class Tea(IBeverage):
def getDescriprion(self) -> str: return "Tea"
def getCost(self) -> int: return 100
class MilkShake(IBeverage):
def getDescriprion(self) -> str: return "Milk Shake"
def getCost(self) -> int: return 250
class ToppingDecorator(IBeverage):
def __init__(self, beverage: IBeverage): self._beverage = beverage
def getDescriprion(self) -> str: return f"{self._beverage.getDescriprion()}, {self.getToppingDescription()}"
def getCost(self) -> int: return self._beverage.getCost() + self.getToppingCost()
@abstractmethod
def getToppingDescription(self) -> str: pass
@abstractmethod
def getToppingCost(self) -> int: pass
class Cinnamon(ToppingDecorator):
def getToppingDescription(self) -> str: return "Cinnamon"
def getToppingCost(self) -> int: return 30
class Ice(ToppingDecorator):
def getToppingDescription(self) -> str: return "Ice"
def getToppingCost(self) -> int: return 15
coffee, tea, milkshake = Coffe(), Tea(), MilkShake()
beverages = [Ice(Cinnamon(coffee)), Cinnamon(tea), Cinnamon(milkshake)]
for beverage in beverages: print(f"{beverage.getDescriprion()} - Cost: {beverage.getCost()}")

34
flyweight.py Normal file
View File

@ -0,0 +1,34 @@
from abc import ABC, abstractmethod
class Flyweight(ABC):
"""Абстрактный класс Легковеса."""
@abstractmethod
def operation(self, extrinsic_state): pass
"""Конкретный Легковес, который хранит внутреннее состояние."""
class ConcreteFlyweight(Flyweight):
def __init__(self, intrinsic_state): self.intrinsic_state = intrinsic_state
def operation(self, extrinsic_state):
return f"Легковес с внутренним состоянием: {self.intrinsic_state}, и адресом: {extrinsic_state}"
class FlyweightFactory:
"""Фабрика Легковесов, которая управляет созданием и хранением Легковесов."""
def __init__(self): self._flyweights = {}
def get_flyweight(self, intrinsic_state):
if intrinsic_state not in self._flyweights:
self._flyweights[intrinsic_state] = ConcreteFlyweight(intrinsic_state)
return self._flyweights[intrinsic_state]
factory = FlyweightFactory()
# Создаем легковесы
flyweights = [
factory.get_flyweight("A"),
factory.get_flyweight("B"),
factory.get_flyweight("A"), # Этот легковес будет переиспользован
factory.get_flyweight("C"),
]
# Выполняем операции с легковесами
for i, flyweight in enumerate(flyweights):
print(flyweight.operation(f"{flyweight}"))

28
iterator.py Normal file
View File

@ -0,0 +1,28 @@
from typing import List, Iterator
# юзер = его имя + список друзей
class VkUser:
def __init__(self, name: str, friends: List[str]):
self.name = name
self.friends = friends
def get_friends(self) -> List[str]:
return self.friends
class VkFriendIterator(Iterator):
def __init__(self, vk_user: VkUser):
self._vk_user = vk_user
self._index = 0
def __iter__(self):
return self
def __next__(self):
if self._index < len(self._vk_user.get_friends()):
friend = self._vk_user.get_friends()[self._index]
self._index += 1
return friend
else:
raise StopIteration
user = VkUser("Alice", ["Bob", "Charlie", "David", "Emma"])
friends_iterator = VkFriendIterator(user)
print(f"Friends of {user.name}:")
for friend in friends_iterator:
print(friend)

48
mediator.py Normal file
View File

@ -0,0 +1,48 @@
from abc import ABC, abstractmethod
class IMediator(ABC):
@abstractmethod
def register_user(self): pass
@abstractmethod
def send_message(self): pass
class Mediator:
"""Класс-посредник, который управляет взаимодействием между пользователями."""
def __init__(self): self._users = []
def register_user(self, user):
"""Регистрация пользователя в системе."""
self._users.append(user)
user.set_mediator(self)
def send_message(self, sender, message):
"""Отправка сообщения от одного пользователя всем остальным."""
for user in self._users:
if user != sender: user.receive_message(message)
class User:
"""Класс пользователя, который может отправлять и получать сообщения."""
def __init__(self, name):
self._name = name
self._mediator = None
def set_mediator(self, mediator):
"""Установка посредника для пользователя."""
self._mediator = mediator
def send_message(self, message):
"""Отправка сообщения через посредника."""
print(f"{self._name} отправляет сообщение: {message}")
self._mediator.send_message(self, message)
def receive_message(self, message):
"""Получение сообщения от другого пользователя."""
print(f"{self._name} получил сообщение: {message}")
mediator = Mediator()
user1, user2, user3 = User("Alice"), User("Bob"), User("Charlie")
mediator.register_user(user1)
mediator.register_user(user2)
mediator.register_user(user3)
user1.send_message("Привет всем!")

39
memento.py Normal file
View File

@ -0,0 +1,39 @@
from abc import ABC, abstractmethod
class IMemento(ABC):
@abstractmethod
def get_state(self): pass
class Memento(IMemento):
"""Класс Снимок, который хранит состояние объекта."""
def __init__(self, state): self._state = state
def get_state(self): return self._state
class TextEditor:
"""Класс текстового редактора, который изменяет свое состояние."""
def __init__(self): self._text = ""
def write(self, text): self._text += text
def get_text(self): return self._text
def save(self):
"""Сохраняем текущее состояние в снимок."""
return Memento(self._text)
def restore(self, memento):
"""Восстанавливаем состояние из снимка."""
self._text = memento.get_state()
class Caretaker:
"""Класс Хранитель, который управляет сохранением и восстановлением снимков."""
def __init__(self): self._mementos = []
def save_memento(self, memento): self._mementos.append(memento)
def get_memento(self, index): return self._mementos[index]
editor, caretaker = TextEditor(), Caretaker()
# Пишем текст и сохраняем состояние
editor.write("Hello, ")
caretaker.save_memento(editor.save())
editor.write("world!")
caretaker.save_memento(editor.save())
print("Текущий текст:", editor.get_text()) # Вывод: Hello, world!
# Восстанавливаем предыдущее состояние
editor.restore(caretaker.get_memento(0))
print("После восстановления:", editor.get_text()) # Вывод: Hello,

25
proxy.py Normal file
View File

@ -0,0 +1,25 @@
from abc import ABC, abstractmethod
class IService(ABC):
@abstractmethod
def request(self): pass
class RealService(IService):
def request(self): print("RealService: Handling request.")
class ProxyService(IService):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
# Дополнительные операции до вызова метода оригинала
print("Proxy: Checking access before firing a real request.")
# Вызов метода оригинала
result = self._real_subject.request()
# Дополнительные операции после вызова метода оригинала
print("Proxy: Logging the request.")
return result
# Клиентский код
if __name__ == "__main__":
real_service = RealService()
proxy = ProxyService(real_service)
proxy.request() # Клиент вызывает метод через прокси

22
singleton.py Normal file
View File

@ -0,0 +1,22 @@
class Singleton:
__instance = None
def __init__(self):
if not Singleton.__instance:
print("init method is called")
else:
print("instance is already created:", self.getInstance())
@classmethod
# cls — это конвенция, аналогичная self, но вместо ссылки на экземпляр класса (как в обычных методах),
# она ссылается на сам класс. Это позволяет вам обращаться к атрибутам и методам
# класса без необходимости создавать экземпляр класса.
def getInstance(cls):
if not cls.__instance:
cls.__instance = Singleton()
return cls.__instance
singleton1 = Singleton.getInstance()
singleton2 = Singleton.getInstance()
print("singleton1:", singleton1)
print("singleton2:", singleton2)

81
state.py Normal file
View File

@ -0,0 +1,81 @@
from abc import ABC, abstractmethod
# интерфейс состояния
class State(ABC):
@abstractmethod
def insert_coin(self): pass
@abstractmethod
def select_drink(self): pass
@abstractmethod
def dispense(self): pass
# состояние ожидания монеты
class WaitingForCoinState(State):
def __init__(self, vending_machine): self.vending_machine = vending_machine
def insert_coin(self):
print("Монета принята")
self.vending_machine.set_state(self.vending_machine.waiting_for_selection)
def select_drink(self):
print("Сначала вставьте монету")
def dispense(self):
print("Невозможно выдать напиток без оплаты")
# состояние "Нет товаров"
class OutOfStockState(State):
def __init__(self, vending_machine): self.vending_machine = vending_machine
def insert_coin(self): print("Нет товаров")
def select_drink(self): print("Нет товаров")
def dispense(self): print("Нет товаров")
# состояние "Ожидание выбора"
class WaitingForSelectionState(State):
def __init__(self, vending_machine): self.vending_machine = vending_machine
def insert_coin(self):
print("Монета уже вставлена")
def select_drink(self):
print("Напиток выбран")
self.vending_machine.set_state(self.vending_machine.dispensing)
def dispense(self):
print("Выберите напиток, прежде чем получить его")
# состояние "Выдача товара"
class DispensingState(State):
def __init__(self, vending_machine): self.vending_machine = vending_machine
def insert_coin(self): print("Идет выдача напитка")
def select_drink(self): print("Идет выдача напитка")
def dispense(self):
if self.vending_machine.stock > 0:
self.vending_machine.stock -= 1
print("Напиток выдан")
if self.vending_machine.stock == 0:
print("Товар закончился")
self.vending_machine.set_state(self.vending_machine.out_of_stock)
else:
self.vending_machine.set_state(self.vending_machine.waiting_for_coin)
else:
print("Товар закончился")
self.vending_machine.set_state(self.vending_machine.out_of_stock)
# контекст
class VendingMachine:
def __init__(self):
self.stock = 0
self.out_of_stock = OutOfStockState(self)
self.waiting_for_coin = WaitingForCoinState(self)
self.waiting_for_selection = WaitingForSelectionState(self)
self.dispensing = DispensingState(self)
self.state = self.out_of_stock
def set_state(self, state): self.state = state
def insert_coin(self): self.state.insert_coin()
def select_drink(self): self.state.select_drink()
def dispense(self): self.state.dispense()
def refill(self, amount):
self.stock += amount
print(f"Товар пополнен. Запас: {self.stock}")
if self.stock > 0:
self.set_state(self.waiting_for_coin)
vending_machine = VendingMachine()
vending_machine.refill(3)
vending_machine.insert_coin()
vending_machine.select_drink()
vending_machine.dispense()
vending_machine.select_drink()
vending_machine.insert_coin()
vending_machine.dispense()
vending_machine.dispense()
vending_machine.dispense()

34
visitor.py Normal file
View File

@ -0,0 +1,34 @@
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)