Назад к вопросам
Middle+
81
questionbank

Что такое структурные паттерны проектирования?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Структурные паттерны проектирования описывают, как классы и объекты могут быть скомбинированы для построения более крупных структур. Они помогают организовать взаимодействие между объектами, делая систему более гибкой и поддерживаемой.

Некоторые распространенные структурные паттерны:

  • Адаптер (Adapter): Позволяет работать вместе классам с несовместимыми интерфейсами.
  • Мост (Bridge): Отделяет абстракцию от ее реализации, позволяя им изменяться независимо.
  • Компоновщик (Composite): Позволяет рассматривать группу объектов так же, как и один объект.
  • Декоратор (Decorator): Динамически добавляет новое поведение к объектам без изменения их кода.
  • Фасад (Facade): Предоставляет унифицированный интерфейс к набору интерфейсов в подсистеме.
  • Приспособленец (Flyweight): Экономит память, разделяя общее состояние между множеством мелких объектов.
  • Заместитель (Proxy): Предоставляет заместитель для другого объекта для контроля доступа к нему.

Пример применения паттерна Декоратор:

# Базовый компонент
class Coffee:
    def cost(self):
        return 5

    def description(self):
        return "Обычный кофе"

# Базовый декоратор
class CoffeDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost()

    def description(self):
        return self._coffee.description()

# Конкретный декоратор
class MilkDecorator(CoffeDecorator):
    def cost(self):
        return self._coffee.cost() + 2

    def description(self):
        return self._coffee.description() + ", с молоком"

# Использование
my_coffee = Coffee()
print(my_coffee.description(), "-", my_coffee.cost()) # Обычный кофе - 5

coffee_with_milk = MilkDecorator(my_coffee)
print(coffee_with_milk.description(), "-", coffee_with_milk.cost()) # Обычный кофе, с молоком - 7

Эти шаблоны обеспечивают гибкость за счет использования композиции объектов вместо наследования, что позволяет вносить изменения в систему без изменения существующего кода.