ООП для чайников. Паттерны проектирования. Декоратор (decorator)

Еще один паттерн из группы структурирующих, — декоратор. Его назначение в том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на отдельный объект, а не на класс в целом. Функциональность обязанностей реализуется в небольших объектах. Преимущество состоит в возможности динамически добавлять эту функциональность до или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от классов с похожей функциональностью.

Классический пример Декоратора, — это какой-нибудь класс, рисующий прямоугольник, с добавлением декораторов, которые рисуют рамки, заливают цветом или изображением. Причем, применение декоратора, рисующего рамку дважды, нарисует двойную рамку.

На диаграмме Декоратор выглядит так:

decorator

Пример реализации паттерна Декоратор:

class BaseModel():
    
    def __init__(self):
        self.features = {"speakers":4, "airbag": 1, "engine": "1.2L"}
        
    def getPrice(self):
        return 12000

class AmbientModel():
    
    def __init__(self, model):
        self.price = model.getPrice() + 2200
        self.features = model.features
        self.features["airbag"] = 2
        self.features["speakers"] = 6
        self.features.setdefault("ligh", "halogen")
        
    
    def getPrice(self):
        return self.price
    
class SportModel(BaseModel):
    
    def __init__(self, model):
        self.price = model.getPrice() + 3800
        self.features = model.features
        self.features["airbag"] = 4
        self.features["engine"] = "1.6L"

    def getPrice(self):
        return self.price

class Auto:
    
    def __init__(self, model):
        self.model = model

    def specification(self):
        for i in self.model.features.keys():
            print("%-10s: %s" % (i, self.model.features[i]))
        print(("price     : %d") % self.model.getPrice())



if __name__ == '__main__':        
    model = BaseModel()
    model = AmbientModel(model)
    model = SportModel(model)
    auto = Auto(model)
    auto.specification()

-------------------

airbag    : 4
engine    : 1.6L
speakers  : 6
ligh      : halogen
price     : 18000

Site Footer

Sliding Sidebar

About Me

About Me

For whom this blog for?

For those who are interested in modern Internet technologies, IT business, startups, management, quality control, personal effectiveness, motivation. Here I write about what is interesting, about problems I faced and solutions I found. I hope it will be interesting to you either.

What motivates me to write?

The desire to improve, to study deeper topics that interest me. Find people with similar problems and tasks, together look for ways out and solutions.

Feel free to contact if you have anything to say to me

Old Flash site with my artistic works and misuc.