Sobes.tech
Middle

რა არის დეკორატორი (Decorator) პროგრამირების კონტექსტში და როგორ გამოიყენება?

sobes.tech AI

პასუხი AI-სგან

დეკორატორი — ეს სტრუქტურული დიზაინის ნიმუშია, რომელიც საშუალებას აძლევს დინამიურად დაამატოთ ახალი ქცევა ან მოვალეობები ობიექტებს მათი სტრუქტურის შეცვლის გარეშე.

ძირითადი იდეები:

  • ობიექტს აფარებს, მისი ფუნქციონალობის გაფართოებით.
  • ინარჩუნებს აფარებულ ობიექტის ინტერფეისს, უზრუნველყოფს ჩანაცვლებადობას.
  • თავიდან აცილებს კლასების ჰიერქხიის ზრდას ახალი ქცევის კომბინაციების დამატებისას.

გამოყენება:

  1. "ლაივში" ფუნქციონალის გაფართოება: გამოიყენება, როდესაც საჭიროა ობიექტის ქცევის დამატება ან შეცვლა პროგრამის შესრულების დროს.
  2. მემკვიდრეობის ალტერნატივა: თითოეული ქცევის კომბინაციისთვის ქვესკლასების შექმნის ნაცვლად, გამოიყენება დეკორატორები. ეს უფრო მოქნილი მიდგომაა.
  3. ქცევების კომბინირება: სხვადასხვა დეკორატორი შეიძლება იყოს გამოყენებული ერთ ობიექტზე სხვადასხვა წესით, ქმნის უნიკალურ კომბინაციებს.

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()
# შედეგი:
# წინ ფუნქცია
# გამარჯობა!
# შემდეგა ფუნქცია