Sobes.tech
Middle+

Czym są wzorce projektowe strukturalne?

sobes.tech AI

Odpowiedź od AI

Wzorce projektowe strukturalne opisują, jak klasy i obiekty mogą być łączone w celu tworzenia większych struktur. Pomagają one organizować interakcję między obiektami, czyniąc system bardziej elastycznym i łatwiejszym w utrzymaniu.

Niektóre popularne wzorce strukturalne:

  • Adapter (Adapter): Umożliwia współpracę klas z niekompatybilnymi interfejsami.
  • Most (Bridge): Oddziela abstrakcję od jej implementacji, pozwalając na ich niezależne zmiany.
  • Kompozyt (Composite): Pozwala traktować grupę obiektów jak pojedynczy obiekt.
  • Dekorator (Decorator): Dynamicznie dodaje nowe zachowanie do obiektów bez zmiany ich kodu.
  • Fasada (Facade): Zapewnia zunifikowany interfejs do zestawu interfejsów w podsystemie.
  • Flyweight (Flyweight): Oszczędza pamięć, dzieląc wspólne stan między wieloma małymi obiektami.
  • Proxy (Proxy): Zapewnia zastępcę dla innego obiektu w celu kontroli dostępu do niego.

Przykład zastosowania wzorca Dekorator:

# Podstawowy komponent
class Coffee:
    def cost(self):
        return 5

    def description(self):
        return "Zwykła kawa"

# Podstawowy dekorator
class CoffeeDecorator:
    def __init__(self, coffee):
        self._coffee = coffee

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

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

# Konkretne dekoratory
class MilkDecorator(CoffeeDecorator):
    def cost(self):
        return self._coffee.cost() + 2

    def description(self):
        return self._coffee.description() + ", z mlekiem"

# Użycie
my_coffee = Coffee()
print(my_coffee.description(), "-", my_coffee.cost()) # Zwykła kawa - 5

coffee_with_milk = MilkDecorator(my_coffee)
print(coffee_with_milk.description(), "-", coffee_with_milk.cost()) # Zwykła kawa, z mlekiem - 7

Te wzorce zapewniają elastyczność dzięki użyciu kompozycji obiektów zamiast dziedziczenia, co pozwala na wprowadzanie zmian w systemie bez modyfikacji istniejącego kodu.