декораторы с тем же именем

#design-patterns #decorator #uml

#шаблоны проектирования #декоратор #uml

Вопрос:

ну, я собираюсь быть прямым, речь идет о шаблоне декоратора, который вы увидите, я сделал этот график, чтобы проиллюстрировать ситуацию

у меня есть два класса (скажем, CAR и VAN), которые связаны, как указано на графике, и мне нужно

свободно комбинировать два класса декораторов .. но у меня есть один декоратор, который применим только для одного из них, поскольку эти декораторы добавляют определенную функциональность, но эта функциональность по сути

то же самое для соответствующего класса..

могу ли я назвать их одинаково?

следуя тому же графику, я попытался наследовать VAN от CAR. таким образом, у них обоих одинаковые декораторы.. но, как сказал ia

В ФУРГОНЕ не может быть сжиженного газа «

итак, мой вопрос остается.. могу ли я назвать их обоих декораторами одинаково?

заранее большое спасибо

gmocamilo

http://www.depositodeimagenes.com/images/h2bpM.jpg

pd. im извините, но система не позволяет мне загружать рисунки

Комментарии:

1. лучший источник об этом шаблоне взят из sourcemaking.com/design_patterns/decorator но ни там, ни где-либо еще я не нахожу такой ситуации

Ответ №1:

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

 class LiquidGasDecorator extends Vehicle
{
   private SimpleCar simplecar_;
   public LiquidGasDecorator(SimpleCar simplecar)
   {
     simplecar_ = simplecar;
   }
}

Vehicle fourwheelvan = new FourWheelDriveDecorator(new Van());
Vehicle fourwheelcarwithlpg = new LiquidGasDecorator(new FourWheelDriveDecorator(new SimpleCar)));
  

Комментарии:

1. Озан, ты совершенно прав! я запутался в деталях дочерних классов, я не знаю, как я пропустил это очевидное расположение большое вам спасибо!

Ответ №2:

Я думаю, вам следует создать класс Car, затем вы создаете класс CarDecorator. От CarDecorator вы наследуете классы, содержащие нужные вам атрибуты.

Таким образом, когда вы создаете автомобиль, вы используете классы из CarDecorator для добавления различных «частей» к вашему автомобилю, и поскольку вы наследуете от CarDecorator, вы можете каскадировать атрибуты, имея один конструктор, который принимает CarDecorator в качестве аргумента:

Например.

 Car* van = new Car( new FourWheelDrive() );
  

и

 Car* car = new Car( new FourWheelDrive( new LiquidGas() ) );
  

Конечно, вы могли бы с самого начала установить четырехколесный привод в автомобиль базового класса, но при этом, если вы когда-нибудь захотите иметь трехколесный автомобиль в будущем, вам придется изменить базовый класс со всеми вытекающими отсюда последствиями. Описанный выше подход позволяет сохранить базовый класс нетронутым.

Комментарии:

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