67d837fa f648 800a 9cbe efc1cd1b4715 - gusenov/software-design-patterns GitHub Wiki
Можешь ли придумать небольшой осмысленный, репрезентативный пример, мини-систему какую-то в которой бы использовались все классические паттерны проектирования?
Пример небольшой системы, использующей все классические паттерны проектирования, можно сделать в виде мини-фреймворка для обработки команд в консольном приложении. Допустим, это будет система для обработки команд пользователей, выполнения операций и логирования.
Описание: Система принимает команды от пользователя, обрабатывает их через набор обработчиков, логирует действия и управляет состоянием.
- Factory Method – для создания объектов команд.
- Abstract Factory – для создания семейств объектов команд и их обработчиков.
- Builder – для пошагового построения сложных запросов (например, SQL-запросов в будущем расширении).
- Prototype – для клонирования команд (например, возможность повторить последнюю команду).
- Singleton – для глобального логгера.
- Adapter – для приведения разных интерфейсов команд к единому формату.
- Bridge – для разделения логики обработки команд и вывода результатов.
- Composite – для объединения нескольких команд в одну (например, макросы).
- Decorator – для добавления логирования к обработке команд.
- Facade – для удобного интерфейса взаимодействия с системой.
- Flyweight – для хранения множества однотипных команд (например, кэширование команд).
- Proxy – для ленивой загрузки команд или ограничения их вызова.
- Chain of Responsibility – для передачи команд через цепочку обработчиков.
- Command – для инкапсуляции запросов (каждая команда – отдельный объект).
- Interpreter – для разбора пользовательского ввода.
- Iterator – для перебора команд в истории.
- Mediator – для общения между объектами (например, между логгером и обработчиками команд).
- Memento – для сохранения состояния команд и их отката.
- Observer – для подписки логгера на выполнение команд.
- State – для переключения режима работы системы (например, обычный и режим отладки).
- Strategy – для выбора алгоритма выполнения команд.
- Template Method – для задания базового алгоритма выполнения команд с возможностью расширения.
- Visitor – для выполнения операций над разными типами команд (например, сериализация команд в JSON).
from abc import ABC, abstractmethod
# Singleton – логгер
class Logger:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super(Logger, cls).__new__(cls)
cls._instance.logs = []
return cls._instance
def log(self, message):
self.logs.append(message)
print(f"LOG: {message}")
# Command – базовый интерфейс команды
class Command(ABC):
@abstractmethod
def execute(self):
pass
# ConcreteCommand – конкретная команда
class PrintCommand(Command):
def __init__(self, message):
self.message = message
def execute(self):
Logger().log(f"Executing PrintCommand: {self.message}")
print(self.message)
# Factory Method – фабрика команд
class CommandFactory:
@staticmethod
def create_command(command_type, *args):
if command_type == "print":
return PrintCommand(*args)
raise ValueError("Unknown command")
# Invoker – объект, который управляет командами
class CommandInvoker:
def __init__(self):
self.history = []
def execute_command(self, command):
command.execute()
self.history.append(command)
def undo(self):
if self.history:
last_command = self.history.pop()
Logger().log(f"Undoing command: {last_command}")
# Client
if __name__ == "__main__":
invoker = CommandInvoker()
cmd = CommandFactory.create_command("print", "Hello, World!")
invoker.execute_command(cmd)
invoker.undo()
- Добавить новые команды (например, вычисления, работа с файлами).
- Использовать шаблоны Decorator и Proxy для добавления логирования и прав доступа.
- Сделать поддержку макросов с помощью Composite.
- Добавить Memento для сохранения состояний (например, откат системы).
- Добавить Strategy для выбора разных способов обработки команд.
Таким образом, даже такая небольшая система позволяет продемонстрировать основные паттерны проектирования.