Sobes.tech
Middle

Kas yra dekoratorius?

sobes.tech AI

Atsakymas iš AI

Dekoratorius yra struktūrinis dizaino šablonas, leidžiantis dinamiškai pridėti naują elgseną objektams, juos apvyniojant specialiais dekoratoriaus objektais.

Pagrindiniai principai:

  • Kompozicija vietoj paveldėjimo. Dekoratorius išplečia objekto funkcionalumą, nekeisdamas jo klasės ir nenaudodamas paveldėjimo.
  • Lankstumas. Leidžia pridėti arba pašalinti objekto užduotis vykdymo metu.
  • Suderinamumas. Dekoratoriai ir apvynioti objektai turi bendrą sąsają, leidžiančią juos keisti vienas kitu.

Struktūra:

  • Komponentas (Component): Sąsaja objektams, kuriems galima dinamiškai pridėti naujų užduočių.
  • Konkrečios komponentas (ConcreteComponent): Komponento įgyvendinimas.
  • Dekoratorius (Decorator): Abstrakti klasė arba sąsaja, kuri išplečia komponentą ir turi nuorodą į komponento objektą.
  • Konkrečios dekoratoriai (Concrete Decorators): Dekoratoriaus įgyvendinimai, pridedantys konkretų elgesį.

Pavyzdys (Python):

// Sąsaja komponentui
class Coffee:
    def get_cost(self):
        pass

    def get_description(self):
        pass

// Konkrečios komponentas
class SimpleCoffee(Coffee):
    def get_cost(self):
        return 1.0

    def get_description(self):
        return "Paprasta kava"

// Pagrindinis dekoratorius
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()

// Konkrečios dekoratorius (Pienas)
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() + ", Pienas"

// Naudojimas
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # Paprasta kava: 1.0

coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # Paprasta kava, Pienas: 1.5

Privalumai:

  • Labai lankstus būdas išplėsti objektų funkcionalumą nei paveldėjimas.
  • Vengia paveldėjimo susijusių pogrupių augimo.
  • Leidžia pridėti kelis "sluoksnius" elgesio vienam objektui.

Trūkumai:

  • Gali sudėtinginti kodą dėl daugybės mažų objektų.
  • Apvyniojimo tvarka gali būti svarbi.

Taikymas QA / automatizavime:

  • Pridėti žurnalavimą prie esamų metodų be jų šaltinio kodo keitimo.
  • Įgyvendinti išimčių apdorojimą tam tikriems iškvietimams.
  • Pridėti laiko matavimą ar našumo metrikas.
  • Naudoti bibliotekas testų automatizavimui (pavyzdžiui, Page Object šablone, pridėti patikrinimus ar žurnalavimą sąveikaujant su elementais).