2012-11-20 4 views
5

Учтите, что у нас есть объект Car. Ускорение и нарушение функции реализованы с использованием стратегический шаблон. Но что, если мы хотим, чтобы вводил функцию газового газа для существующего объекта автомобиля? Какую модель дизайна я могу использовать?Дизайн шаблона для динамического добавления атрибутов объектов

Я хочу добавить нитро-функцию (атрибут) после создания объекта автомобиля.

ответ

-1

В статически типизированных языках вы не можете добавлять методы к объекту во время выполнения. Компилятор, когда он сталкивается с утверждением типа: car.nitroAccelerate(), проверяет, реализует ли какой-либо объект автомобиля какой-либо интерфейс, который имеет метод nitroAccelerate. Если вы могли бы добавлять (или удалять) методы во время выполнения, такие проверки были бы невозможны.

Динамические языки позволяют добавлять методы во время выполнения. Но у этого есть недостаток, когда вы помещаете car.nitroAccelerate() в код, вам нужно тщательно проанализировать, имеет ли этот объект автомобиль в этой точке такой метод.

Вы можете использовать декоратор для изменения существующих методов во время выполнения, но при этом вы не изменяете существующий объект, а просто создаете новый, который обертывает старый.

Так что если вы делаете что-то вроде:

Car fasterCar = new CarWithNitro(car); 

и некоторый кусок кода все еще содержит ссылку на оригинальный автомобиль, этот оригинальный автомобиль не будет быстрее, потому что акт упаковки не изменяет оригинал.

10

Вы можете проверить Decorator pattern, его можно использовать для динамического добавления функциональности к существующему объекту.

+1

Мне нравится узор Decorator. – Neowizard

+0

Но можем ли мы добавлять новые состояния или поведения во время выполнения с использованием шаблона Decorator. –

+1

Оформление декоратора заключается в добавлении функциональности, обертывании объекта и экспонировании расширенного интерфейса. Сама эта новая функциональная реализация может использовать дополнительные инструменты и методы, такие как дополнительные шаблоны проектирования. Помните, шаблон дизайна не является заменой вашего собственного кода, это инструмент, который следует использовать, когда это необходимо. – SomeWittyUsername

2

Декоратор может динамически добавлять разные функции в объекты. Но эти функции должны быть реализованы в Concrete Decorator. Разработчик может решить, какие функции добавить во время выполнения.

0

Если вы хотите добавить новые методы, вам необходимо создать новый подкласс и/или использовать делегирование. Это необходимо, если для функции «нитро» требуется активировать явный метод.

Если, однако, все, что вы хотите сделать, это добавить к существующим функциям без добавления методов, Decorator - хорошая ставка. Предположим, что интерфейс «Car» имеет метод наподобие floorIt(). В этом случае вы можете добавить «нитроный удар» на пол с Decorator, не добавляя к Intoface Car.

Конечно, есть средняя площадка. Если вы используете обнаружение времени выполнения и/или несколько интерфейсов, вы можете использовать Decorator и добавить методы к результирующему объекту.

Смежные вопросы