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

Нет комментариев
Перейти к форме добавления комментария | comments rss[?] | trackback uri [?]