ООП для чайников. Паттерны проектирования. Декоратор (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
 

Comments

comments


Bookmark and Share