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

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

  • Восторгаюсь красотой и изяществом этого паттерна. Но есть и вопрос ответа на который пока не могу получить.

    Звучит так:
    Смотря на рисунок мы видим класс Decorator. Для чего нужно его создавать если классы конкретных декораторов ConcreteDecoratorA и ConcreteDecoratorB можно напрямую наследовать от Component?

  • у декораторов может быть свой “декораторский” набор функций. И они как раз реализуются в классе Decorator. Например, в конструкторе декоратора сохраняем объект в свойство и получаем его при необходимости через геттер. Вот этот самый геттер будет реализован в Decorator.

Leave a reply:

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Site Footer

Sliding Sidebar

About Me

About Me

Для кого этот блог?

Для тех кого интересуют современные интернет технологи, IT бизнес, стартапы, менеджмент, контроль качества, личная эффективность, мотивация. Здесь я буду писать о том, что в первую очередь будет интересно мне, о проблемах и решениях. О том что пригодилось мне, и возможно будет интересно Вам.

Что заставило меня создать его?

Желание совершенствоваться. Достигать успеха. Находить людей со схожими проблемами и задачами, вместе искать выходы и решения.

Немного о себе.

Мой первый серьезный опыт в IT это работа над desktop приложениями в компании «Эксперт-Софт». У истоков её стояли несколько амбициозных и талантливых молодых людей, с огнем в глазах и желанием работать «как майкрософт». То чем мы там занимались вполне могли бы сегодня назвать «стартапом». Рук было откровенно мало, поэтому приходилось заниматься всем: кодированием на Delphi, написанием скриптов на VBA, дизайном, вёрсткой и поддержкой вебсайта, работой над рекламной полиграфией, проектированием интерфейсов и БД. Работы было много, но запал был велик, команда очень разношерстная, гармонично дополняя друг-друга в решении нетривиальных задач. Благодаря тому что пришлось попробовать многое, постепенно вырисовалось понимание того чем хочется заниматься, и как. Софтверным программированием я был сыт по горло. Массы проблем десктопного софта в вебе просто не было, по определению. Зато был четкий фокус на дизайне, юзабилити, скорости. Поэтому когда пришла пора уходить из «Эксперт-Софт», я без всякого сожаления стал искать работу как разработчик для web. Поскольку городишко у нас не очень большой, выбор был практически предопределен. Так я стал работать в «Оникс-Системз», где и продолжаю работать поныне. За время работы в компании я как разработчик принимал участие в работе над несколькими десятками проектов. Несколько десятков проектов было сделано мною как фрилансером. Самым большим проектом в котором я сыграл роль менеджера, считаю свою семью. Также довольно большой проект мы сейчас поднимаем с командой разработчиков (на данный момент команда состоит из четырех php разработчиков, одного flex кодера и тестировщика). Отсюда, большой интерес к современным практикам и методологиям, разным подходам в управлении командой, повышению эффективности и качества работы. По мере сил, вдохновения и свободного времени, я буду писать об этом.

Если у Вас возникли какие-то вопросы ко мне лично, буду рад если Вы свяжетесь со мной:

e-mail:
skype: denis.sheremetov
Старый сайт, с музычкой и флешом

Прочая онлайновая деятельность: