Sobes.tech
Middle

Ինչ է դեկորատորը (Decorator)?

sobes.tech AI

Պատասխան AI-ից

Դեկորատորը՝ դա կառուցվածքային նախագծման ձևանմուշ է, որը թույլ է տալիս դինամիկ ավելացնել նոր գործառույթներ օբյեկտին՝ առանց նրա կառուցվածքը փոխելու։ Այն շրջապատում է օբյեկտը՝ տրամադրելով նույն ինտերֆեյսը, ինչ շրջապատված օբյեկտը, միաժամանակ ավելացնելով կամ փոխելով նրա վարքագիծը։

Հիմնական տարրերը՝

  • Կոմպոնենտ (Component)՝ ինտերֆեյս կամ աբստրակտ դաս, որը սահմանում է ընդհանուր գործառույթը շրջապատվող օբյեկտների և դեկորատորների համար։
  • Կոնկրետ կոմպոնենտ (Concrete Component)՝ կոմպոնենտի իրագործում, հիմնական օբյեկտ, որի վրա ավելացվում է գործառույթը։
  • Դեկորատոր (Decorator)՝ աբստրակտ դաս, որը իրագործում է Կոմպոնենտի ինտերֆեյսը և պարունակում է հղում Կոմպոնենտ օբյեկտին։
  • Կոնկրետ դեկորատոր (Concrete Decorator)՝ դեկորատորի իրագործում, որը ավելացնում է հատուկ գործառույթը՝ նախ կամ հետո շրջապատվող օբյեկտի մեթոդի կանչը։

Python-ում օրինակ՝

# Կոմպոնենտ
class Coffee:
    def get_cost(self):
        return 5 # Կոֆեի հիմնական արժեք
    
    def get_description(self):
        return "Simple Coffee"

# Կոնկրետ կոմպոնենտ
class SimpleCoffee(Coffee):
    pass

# Դեկորատոր
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()

# Կոնկրետ դեկորատոր
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Դեղձի արժեքը ավելացնելը

    def get_description(self):
        return self._coffee.get_description() + ", Milk"

# Օգտագործում
# 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()}")

Առավելություններ՝

  • Բազմակողմանիություն՝ գործառույթը ավելացվում է ժամանակի ընթացքում։
  • Նախագծային խուսափում՝ թույլ է տալիս խուսափել բազմաթիվ ենթակլասների ստեղծումից յուրաքանչյուր վարքագծի համար։
  • Պատասխանատվության բաժանում՝ յուրաքանչյուր վարքագծի ավելացում կատարվում է առանձին դասում։

Անբարենպաստություններ՝

  • Կարող է մեծացնել դասերի քանակը։
  • Դեբագը կարող է ավելի բարդ լինել շրջապատող օբյեկտների շղթայի պատճառով։