Sobes.tech
Middle

Mis on dekoratiiv?

sobes.tech AI

Vastus AI-lt

Dekoratsioon on struktuuriline disainimuster, mis võimaldab dünaamiliselt lisada objektidele uut käitumist, pakkides neid spetsiaalsetesse dekoratiivsetesse objektidesse.

Peamised põhimõtted:

  • Kompositsioon asemel pärandumine. Dekoratsioon laiendab objekti funktsionaalsust, muutmata selle klassi ega kasutades pärandumist.
  • Paindlikkus. Võimaldab lisada või eemaldada objekti ülesandeid jooksvalt.
  • Ühilduvus. Dekoratsioonid ja pakitud objektid omavad ühise liidest, mis võimaldab neid vahetada.

Struktuur:

  • Komponent (Component): Liides objektidele, millele saab dünaamiliselt lisada uusi ülesandeid.
  • Konkreetne komponent (ConcreteComponent): Komponendi teostus.
  • Dekoratsioon (Decorator): Abstraktne klass või liides, mis laiendab komponenti ja sisaldab viidet komponenti objekti.
  • Konkreetne dekoratsioon (Concrete Decorators): Dekoratsiooni teostused, mis lisavad konkreetset käitumist.

Näide (Python):

// Komponendi liides
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkreetne komponent
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "Lihtne kohv"

// Põhjadekoratsioon
class CoffeeDecorator(Coffee):
    def __init__(self, decorated_coffee):
        self._decorated_coffee = decorated_coffee

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

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

// Konkreetne dekoratsioon (Piim)
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._decorated_coffee.get_cost() + 0.5

    def get_description(self):
        return self._decorated_coffee.get_description() + ", Piim"

// Kasutamine
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Lihtne kohv: 1.0

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Lihtne kohv, Piim: 1.5

Eelised:

  • Väga paindlik viis laiendada objektide funktsionaalsust kui pärimine.
  • Vältib pärilikkusega seotud alamklasside kasvu.
  • Võimaldab lisada ühe objekti jaoks mitu "kihti" käitumist.

Miinused:

  • Võib keerulisemaks muuta koodi väikeste objektide suure arvu tõttu.
  • Pakendamise järjekord võib olla oluline.

Rakendused QA / automatiseerimine:

  • Logimise lisamine olemasolevatele meetoditele ilma nende lähtekoodi muutmata.
  • Erandite töötlemise rakendamine teatud kutsumustele.
  • Ajastamise või jõudlusmõõdikute lisamine.
  • Raamatukogude kasutamine testide automatiseerimiseks (näiteks Page Object muster, kontrollide või logimise lisamiseks elementidega suhtlemisel).