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).

Пример реализации (условный код на Python)

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()

Как это можно расширить?

  1. Добавить новые команды (например, вычисления, работа с файлами).
  2. Использовать шаблоны Decorator и Proxy для добавления логирования и прав доступа.
  3. Сделать поддержку макросов с помощью Composite.
  4. Добавить Memento для сохранения состояний (например, откат системы).
  5. Добавить Strategy для выбора разных способов обработки команд.

Таким образом, даже такая небольшая система позволяет продемонстрировать основные паттерны проектирования.

⚠️ **GitHub.com Fallback** ⚠️