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!");
}
}