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()}")

Артыкчылыктары:

  • Ийкемдүүлүк: функционалдуулук ишке ашырылуу учурунда кошулушу мүмкүн.
  • Подкласс түзүүнүн алдын алуу: ар бир жүрүм-турумдун аралашмасын түзүүдөн качууга мүмкүндүк берет.
  • Жоопкерчиликти бөлүү: ар бир функционалдуулук кошуу өзүнчө класска өткөрүлөт.

Кемчиликтери:

  • Класстардын саны көбөйүшү мүмкүн.
  • Аралашма чынжырларынан улам дебагдоо кыйынчылыкка дуушар болушу мүмкүн.