Sobes.tech
Middle

Kas ir dekorators (Decorator)?

sobes.tech AI

Atbilde no AI

Dekorators ir struktūras dizaina šablons, kas ļauj dinamiski pievienot jaunu funkcionalitāti objektam, nemainot tā struktūru. Tas ietver objektu, nodrošinot to pašu interfeisu, kā apvītais objekts, vienlaikus pievienojot vai mainot tā uzvedību.

Galvenie elementi:

  • Komponents (Component): Interfeiss vai abstrakta klase, kas definē kopējo funkcionalitāti apvijamiem objektiem un dekoratoriem.
  • Konkrētais komponents (Concrete Component): Komponenta realizācija, galvenais objekts, pie kura tiek pievienota funkcionalitāte.
  • Dekorators (Decorator): Abstrakta klase, kas realizē Komponenta interfeisu un satur atsauci uz Komponenta objektu.
  • Konkrētais dekorators (Concrete Decorator): Dekoratora realizācija, kas pievieno specifisku funkcionalitāti pirms vai pēc apvīto objekta metodes izsaukuma.

Piemērs Python:

# Komponents
class Coffee:
    def get_cost(self):
        return 5 # Kafijas pamatcena
    
    def get_description(self):
        return "Simple Coffee"

# Konkrētais komponents
class SimpleCoffee(Coffee):
    pass

# Dekorators
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

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

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

# Konkrētais dekorators
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Piens cenas pievienošana

    def get_description(self):
        return self._coffee.get_description() + ", Milk"

# Lietošana
# simple_coffee = SimpleCoffee()
# print(f"Cost: {simple_coffee.get_cost()}, Description: {simple_coffee.get_description()}")

# coffee_with_milk = MilkDecorator(simple_coffee)
# print(f"Cost: {coffee_with_milk.get_cost()}, Description: {coffee_with_milk.get_description()}")

Priekšrocības:

  • Elastība: funkcionalitāte tiek pievienota izpildes laikā.
  • Paveldēšanas novēršana: ļauj izvairīties no daudzām apakšklasēm katram uzvedības kombinācijai.
  • Atbildības sadalījums: katrs funkcionalitātes pievienojums tiek veikts atsevišķā klasē.

Trūkumi:

  • Var palielināt klases skaitu.
  • Debugging var kļūt sarežģītāks, ņemot vērā apvīšanas ķēdi.