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()}")
Առավելություններ՝
- Բազմակողմանիություն՝ գործառույթը ավելացվում է ժամանակի ընթացքում։
- Նախագծային խուսափում՝ թույլ է տալիս խուսափել բազմաթիվ ենթակլասների ստեղծումից յուրաքանչյուր վարքագծի համար։
- Պատասխանատվության բաժանում՝ յուրաքանչյուր վարքագծի ավելացում կատարվում է առանձին դասում։
Անբարենպաստություններ՝
- Կարող է մեծացնել դասերի քանակը։
- Դեբագը կարող է ավելի բարդ լինել շրջապատող օբյեկտների շղթայի պատճառով։