我有以下界面。

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

08-19 11:32