Middle
რა არის დეკორატორი?
sobes.tech AI
პასუხი AI-სგან
დეკორატორი — ეს სტრუქტურული დიზაინის ნიმუშია, რომელიც საშუალებას აძლევს დინამიურად დაამატოთ ახალი ქცევა ობიექტებს, მათ სპეციალურ დეკორატორულ ობიექტებში ჩასმა.
ძირითადი პრინციპები:
- კომპოზიცია მემკვიდრეობაზე. დეკორატორი აფართოებს ობიექტის ფუნქციონალობას, არ იცვლის მისი კლასი და არ იყენებს მემკვიდრეობას.
- გლუვობა. საშუალებას აძლევს დაამატოთ ან წაშალოთ ობიექტის მოვალეობები შესრულების დროს.
- სათანადოობა. დეკორატორებს და შეფუთულ ობიექტებს აქვთ საერთო ინტერფეისი, რაც საშუალებას აძლევს მათ ურთიერთგამომრიცხველად გამოყენებას.
სტრუქტურა:
- კომპონენტი (Component): ინტერფეისი ობიექტებისთვის, რომელთაც შეუძლიათ დინამიურად დაამატოთ ახალი მოვალეობები.
- კონკრეტული კომპონენტი (ConcreteComponent): კომპონენტის რეალიზაცია.
- დეკორატორი (Decorator): აბსტრაქტული კლასი ან ინტერფეისი, რომელიც აფართოებს კომპონენტს და შეიცავს მის მისამართს.
- კონკრეტული დეკორატორები (Concrete Decorators): დეკორატორის რეალიზაციები, რომლებიც დამატებით უნარებს აძლევენ.
მაგალითი (Python):
// კომპონენტის ინტერფეისი
class Coffee:
def get_cost(self):
pass
def get_description(self):
pass
// კონკრეტული კომპონენტი
class SimpleCoffee(Coffee):
def get_cost(self):
return 1.0
def get_description(self):
return "სუფთა ყავა"
// საწყისი დეკორატორი
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()
// კონკრეტული დეკორატორი (რძე)
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() + ", რძე"
// გამოყენება
coffee = SimpleCoffee()
print(f"{coffee.get_description()}: ${coffee.get_cost()}") # სუფთა ყავა: 1.0
coffee_with_milk = MilkDecorator(coffee)
print(f"{coffee_with_milk.get_description()}: ${coffee_with_milk.get_cost()}") # სუფთა ყავა, რძე: 1.5
უპირატესობები:
- უფრო მოქნილი გზაა ფუნქციონალობის გაფართოებისთვის, ვიდრე მემკვიდრეობა.
- თავიდან აცილება მემკვიდრეობის დაკავშირებული ქვესაფართოებების ზრდას.
- საშუალებას აძლევს ერთ ობიექტს რამდენიმე "ფენას" ქცევას.
მცირედი:
- შეიძლება გაართულოს კოდი მცირე ობიექტების დიდი რაოდენობის გამო.
- შეფუთვის წესრიგი შეიძლება იყოს მნიშვნელოვანი.
QA / ავტომატიზაციის გამოყენება:
- არსებული მეთოდების ლოგირების დამატება, მათი საწყისი კოდის შეცვლის გარეშე.
- გამონაკლისების დამუშავების განხორციელება კონკრეტული ზარებისათვის.
- დროის გაზომვა ან შესრულების მეტრიკების დამატება.
- ავტომატიზაციის ბიბლიოთეკების გამოყენება (მაგალითად, Page Object pattern-ში, შემოწმებების ან ლოგირების დამატებისთვის ელემენტებთან ურთიერთობის დროს).