В статически типизированных языках вы не можете добавлять методы к объекту во время выполнения. Компилятор, когда он сталкивается с утверждением типа: car.nitroAccelerate(), проверяет, реализует ли какой-либо объект автомобиля какой-либо интерфейс, который имеет метод nitroAccelerate. Если вы могли бы добавлять (или удалять) методы во время выполнения, такие проверки были бы невозможны.
Динамические языки позволяют добавлять методы во время выполнения. Но у этого есть недостаток, когда вы помещаете car.nitroAccelerate() в код, вам нужно тщательно проанализировать, имеет ли этот объект автомобиль в этой точке такой метод.
Вы можете использовать декоратор для изменения существующих методов во время выполнения, но при этом вы не изменяете существующий объект, а просто создаете новый, который обертывает старый.
Так что если вы делаете что-то вроде:
Car fasterCar = new CarWithNitro(car);
и некоторый кусок кода все еще содержит ссылку на оригинальный автомобиль, этот оригинальный автомобиль не будет быстрее, потому что акт упаковки не изменяет оригинал.
Мне нравится узор Decorator. – Neowizard
Но можем ли мы добавлять новые состояния или поведения во время выполнения с использованием шаблона Decorator. –
Оформление декоратора заключается в добавлении функциональности, обертывании объекта и экспонировании расширенного интерфейса. Сама эта новая функциональная реализация может использовать дополнительные инструменты и методы, такие как дополнительные шаблоны проектирования. Помните, шаблон дизайна не является заменой вашего собственного кода, это инструмент, который следует использовать, когда это необходимо. – SomeWittyUsername