Middle
რა არის დეკორატორი (Decorator) პროგრამირების კონტექსტში და როგორ გამოიყენება?
sobes.tech AI
პასუხი AI-სგან
დეკორატორი — ეს სტრუქტურული დიზაინის ნიმუშია, რომელიც საშუალებას აძლევს დინამიურად დაამატოთ ახალი ქცევა ან მოვალეობები ობიექტებს მათი სტრუქტურის შეცვლის გარეშე.
ძირითადი იდეები:
- ობიექტს აფარებს, მისი ფუნქციონალობის გაფართოებით.
- ინარჩუნებს აფარებულ ობიექტის ინტერფეისს, უზრუნველყოფს ჩანაცვლებადობას.
- თავიდან აცილებს კლასების ჰიერქხიის ზრდას ახალი ქცევის კომბინაციების დამატებისას.
გამოყენება:
- "ლაივში" ფუნქციონალის გაფართოება: გამოიყენება, როდესაც საჭიროა ობიექტის ქცევის დამატება ან შეცვლა პროგრამის შესრულების დროს.
- მემკვიდრეობის ალტერნატივა: თითოეული ქცევის კომბინაციისთვის ქვესკლასების შექმნის ნაცვლად, გამოიყენება დეკორატორები. ეს უფრო მოქნილი მიდგომაა.
- ქცევების კომბინირება: სხვადასხვა დეკორატორი შეიძლება იყოს გამოყენებული ერთ ობიექტზე სხვადასხვა წესით, ქმნის უნიკალურ კომბინაციებს.
Python-ის მაგალითი:
# ძირითადი კომპონენტი
class Component:
def operation(self):
pass
# კონკრეტული კომპონენტი
class ConcreteComponent(Component):
def operation(self):
return "ConcreteComponent"
# ძირითადი დეკორატორი (შეინახავს ბმულს აფარებულ ობიექტზე)
class Decorator(Component):
def __init__(self, component):
self._component = component
def operation(self):
return self._component.operation()
# კონკრეტული დეკორატორი A
class ConcreteDecoratorA(Decorator):
def operation(self):
return f"ConcreteDecoratorA({self._component.operation()})"
# კონკრეტული დეკორატორი B
class ConcreteDecoratorB(Decorator):
def operation(self):
return f"ConcreteDecoratorB({self._component.operation()})"
# გამოყენება
simple = ConcreteComponent()
print(simple.operation()) # ConcreteComponent
decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)
decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
Python-ში @ სინტაქსის შაქარი:
def my_decorator(func):
def wrapper():
print("მుందა ფუნქცია")
func()
print("შემდეგა ფუნქცია")
return wrapper
@my_decorator
def say_hello():
print("გამარჯობა!")
say_hello()
# შედეგი:
# წინ ფუნქცია
# გამარჯობა!
# შემდეგა ფუნქცია