Еще один паттерн из группы структурирующих, — декоратор. Его назначение в том чтобы возложить дополнительные обязанности (прозрачные для клиентов) на отдельный объект, а не на класс в целом. Функциональность обязанностей реализуется в небольших объектах. Преимущество состоит в возможности динамически добавлять эту функциональность до или после основной функциональности объекта ConcreteComponent. Декоратор позволяет разгрузить приложение от классов с похожей функциональностью.
Классический пример Декоратора, — это какой-нибудь класс, рисующий прямоугольник, с добавлением декораторов, которые рисуют рамки, заливают цветом или изображением. Причем, применение декоратора, рисующего рамку дважды, нарисует двойную рамку.
На диаграмме Декоратор выглядит так:
Пример реализации паттерна Декоратор:
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