Как таковой, любой код, который хочет использовать методы toggleOnOff(int)
или toggleOnOff()
, будет нуждаться в экземпляре PowerSwitchDecorator
, а не PowerSwitch
. Этот вид поражает цель декоратора, который должен быть прозрачным для клиента.
Если вы хотите, чтобы все реализации имели эти методы, вы должны включить их в интерфейс PowerSwitch
.
Затем, как предлагает @Ani, вы можете изменить вышеприведенный PowerSwitchDecorator
, чтобы расширить PowerSwitch
, чтобы вы могли сделать это:
PowerSwitch switch = new PowerSwitchDecorator(new ConcretePowerSwitch());
switch.toggleOnOff();
Теперь у вас есть переменная типа PowerSwitch
с возможностями PowerSwitchDecorator
.
РЕДАКТИРОВАТЬ: Обратите внимание, что вы должны использовать только установленный шаблон, если он соответствует вашим потребностям. Вы можете использовать подход, который вы показали, если он работает для вас. Не нужно подгонять его по определенному шаблону.
Какой тип объекта вы хотите передать? Вам нужны такие методы в вашем API:
void connect(PowerSwitch powerSwitch, Appliance appliance);
Или такие методы:
void connect(PowerSwitchDecorator powerSwitch, Appliance appliance);
(извините, это не очень хорошие примеры)
Если вы хотите первое, то каждый должен будет вручную «украсить» свои PowerSwitch
, чтобы получить пару удобных методов. Сейчас это может быть удобно для вас, но я думаю, что это будет неудобно для пользователей вашего кода, и они, вероятно, не будут беспокоиться об этом. Если вы хотите последнее, вы должны использовать тип PowerSwitchDecorator
в сигнатурах вашего метода, что означает, что вы всегда имеете дело с PowerSwitchDecorator
s, а не с необработанными PowerSwitch
es.