装饰器+状态模式:如果我要修饰的方法取决于对象的状态怎么办?

时间:2020-04-16 17:50:43

标签: java design-patterns decorator

PC类有几种方法-turnON(),turnOFF()和doWork()。可以修饰doWork()方法,从而为PC添加其他功能。

每个方法都会根据PC的状态更改其行为-因此,当您尝试打开PC时,该方法只是将行为的执行委托给PC的当前状态,并且可以正确地处理它。

但是,如果我想拥有可以修饰的方法doWork(),则该方法还取决于状态(如果状态为PCStateOFF或PCStateIncomplete,则PC不能执行doWork()),该怎么办?

由于State模式指出必须将行为的执行委托给该状态,因此我需要使PCStateON,PCStateOFF和PCStateIncomplete也处理doWork()。但是,如果其PC已装饰,则在执行添加的功能之前,我不会检查PC是否已打开。我可以在PCDecorators的每个doWork()实现内注入一些if / else语句,以仅在当前状态允许的情况下添加功能,但是State的整个思想就是取消if / else。

然后我实际上可以装饰PCStateON类,因为这是装饰PC时唯一改变的类...

如何正确执行此操作?

PC和PCDecorator的通用接口:

interface IPC {
    public void doWork();
}

PC类:

public class PC implements IPC {

    PCState state;

    public PC(){
        this.state = new PCStateIncomplete(this);
    }

    public void turnOn(){
        this.state.turnOn();
    }

    public void turnOff(){
        this.state.turnOff();
    }

    public void changeState(PCState state){
        this.state = state;
    }

    public void doWork() {
        System.out.print("\nWorking... ");
    }
}

公共装饰器类和装饰器:

abstract public class PCDecorator implements IPC{
    protected IPC pc;
    abstract public void doWork();
}
public class PCGamingDecorator extends PCDecorator {
    public PCGamingDecorator(IPC computer) {
        this.pc = computer;
    }

    @Override
    public void doWork(){
        pc.doWork();
        System.out.print("Gaming... ");
    }
}
public class PCMiningDecorator extends PCDecorator{
    public PCMiningDecorator(IPC computer) {
        this.pc = computer;
    }

    @Override
    public void doWork(){
        pc.doWork();
        System.out.print("Mining... ");
    }
}
public class PCStreamingDecorator extends PCDecorator {
    public PCStreamingDecorator(IPC computer) {
        this.pc = computer;
    }

    @Override
    public void doWork(){
        pc.doWork();
        System.out.print("Streaming... ");
    }
}

常见状态:

public interface PCState {
    public void turnOn();
    public void turnOff();
}
public class PCStateIncomplete implements PCState {
    PC pc;
    public PCStateIncomplete(PC pc){
        this.pc = pc;
    }
    public void turnOn(){
        System.out.println("Cannot do Work - PC is Incomplete!");
    }
    public void turnOff(){
        System.out.println("Cannot turn OFF - PC is Incomplete!");
    }
}
public class PCStateOFF implements PCState {
    PC pc;
    public PCStateOFF(PC pc){
        this.pc = pc;
    }
    public void turnOn(){
        this.pc.changeState(new PCStateON(this.pc));
        System.out.println("PC has been turned ON!");
    }
    public void turnOff(){
        System.out.println("PC is already OFF!");
    }
}
public class PCStateON implements PCState {
    PC pc;
    public PCStateON(PC pc){
        this.pc = pc;
    }
    public void turnOn(){
        System.out.println("PC is already ON!");
    }
    public void turnOff(){
        this.pc.changeState(new PCStateOFF(this.pc));
        System.out.println("PC has been turned OFF!");
    }
}

0 个答案:

没有答案