Middle
Kas yra dekoratorius (Decorator)?
sobes.tech AI
Atsakymas iš AI
Dekoratorius yra struktūrinis projektavimo šablonas, leidžiantis dinamiškai pridėti naują funkcionalumą objektui, nekeičiant jo struktūros. Jis apvynioja objektą, teikdamas tą patį sąsają kaip ir apvyniojamas objektas, tuo pačiu pridedant arba keičiant jo elgseną.
Pagrindiniai elementai:
- Komponentas (Component): Sąsaja arba abstrakti klasė, apibrėžianti bendrą funkcionalumą apvyniojamiems objektams ir dekoratoriams.
- Konkrečios komponentas (Concrete Component): Komponento įgyvendinimas, pagrindinis objektas, prie kurio pridedamas funkcionalumas.
- Dekoratorius (Decorator): Abstrakti klasė, įgyvendinanti Komponento sąsają ir turinti nuorodą į Komponento objektą.
- Konkrečios dekoratorius (Concrete Decorator): Dekoratoriaus įgyvendinimas, pridedantis specifinį funkcionalumą prieš arba po apvyniojamo objekto metodo iškvietimo.
Pavyzdys Python kalba:
# Komponentas
class Coffee:
def get_cost(self):
return 5 # Kavos bazinė kaina
def get_description(self):
return "Simple Coffee"
# Konkrečios komponentas
class SimpleCoffee(Coffee):
pass
# Dekoratorius
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()
# Konkrečios dekoratorius
class MilkDecorator(CoffeeDecorator):
def get_cost(self):
return self._coffee.get_cost() + 2 # Pridedame pieno kainą
def get_description(self):
return self._coffee.get_description() + ", Milk"
# Naudojimas
# 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()}")
Privalumai:
- Lankstumas: funkcionalumas gali būti pridedamas vykdymo metu.
- Paveldėjimo išvengimas: leidžia išvengti daugybės pogrupių kūrimo kiekvienam elgsenos deriniui.
- Atsakomybės skirstymas: kiekvienas funkcionalumo pridėjimas yra atskirame klasėje.
Trūkumai:
- Gali padidinti klasių skaičių.
- Derinimas gali būti sudėtingesnis dėl apvyniojimo grandinės.