我有以下界面。
PowerSwitch.java
public interface PowerSwitch {
public boolean powerOn();
public boolean powerOff();
public boolean isPowerOn();
}
上面的接口应包含可以衍生出任何其他功能的最少方法集,以尽可能轻松地添加其他PowerSwitch实现。
我想通过在运行时向PowerSwitch接口添加功能(装饰器的作用),方法是创建一个类,该类保存PowerSwitch实例的组成并添加新方法,例如下面的两个toggleOnOff()方法。这样,我只需要实现两个切换方法一次,它将应用于所有PowerSwitch实现。
这被认为是好/坏做法吗?如果不好,还有其他建议吗?
它确实不符合装饰器模式,因为它增加了额外的方法。是策略模式还是构图模式?还是有另一个模式名称?是否有“接口装饰器”之类的东西?
PowerSwitchDecorator.java
public class PowerSwitchDecorator {
private PowerSwitch ps;
public PowerSwitchDecorator(PowerSwitch ps) {
this.ps = ps;
}
public void toggleOnOff(int millis) throws InterruptedException{
powerOn();
Thread.sleep(millis);
powerOff();
}
public void toggleOnOff(){
powerOn();
powerOff();
}
public boolean powerOn() {
return ps.powerOn();
}
public boolean powerOff() {
return ps.powerOff();
}
public boolean isPowerOn() {
return ps.isPowerOn();
}
}
最佳答案
实际上,任何想要使用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
而不是原始PowerSwitch
。