Design patterns 实现状态驱动类

Design patterns 实现状态驱动类,design-patterns,class,Design Patterns,Class,假设需要实现一个类“CAR” 现在,该类包含各种状态,如“未点燃”、“点燃”、“故障”、“刺穿”等 实现这一要求的方法是在类中使用布尔标志,即“属性”,并在每个成员函数中使用这些布尔标志“检查状态”。比如说, CAR.goRacing() { if(bIsPunctured) return ENUM_CANT_DRIVE; //Start the Engine... } 汽车 { 如果(双穿孔) 返回ENUM\u CANT\u驱动器; //启动引擎。。。 }

假设需要实现一个类“CAR”

现在,该类包含各种状态,如“未点燃”、“点燃”、“故障”、“刺穿”等

实现这一要求的方法是在类中使用布尔标志,即“属性”,并在每个成员函数中使用这些布尔标志“检查状态”。比如说,

CAR.goRacing() { if(bIsPunctured) return ENUM_CANT_DRIVE; //Start the Engine... } 汽车 { 如果(双穿孔) 返回ENUM\u CANT\u驱动器; //启动引擎。。。 } 当对象暴露的状态数量增加时,这个实现看起来很简单,但开始变得非常复杂。我也看到过这样的情况,即单个状态会使对象的维护变得非常麻烦(我确信在这种情况下,我的编程技能要怪我)
有没有标准的方法来实现这样一个状态驱动的对象

我看过Steve Yeggey的,但我真的没有达到一个真实世界的例子


谢谢。

这听起来绝对是一份适合年轻人的工作

基本上,您可以创建应用程序(上下文)并将某些操作的行为定义到单独的类/接口(状态)中

这个类将有不同的实现子类,每个状态一个

当状态更改时,状态对象会将新状态指定给上下文。通过这种方式,您可以将所有状态代码分为单独的类,并避免使用经典的意大利面代码

编辑

这是我能想到的最简单的实现

假设你有一个“宠物”,一个脑袋根据它的状态做一些事情

当该状态完成时,状态将更改为下一个状态(睡眠->唤醒->播放等)

我甚至不知道这是否可以编译。这只是为了得到这个想法*

//These are the states of the "Pet" class
//sleep -> wake up ->  play -> dinner -> sleep -> wake up .. etc. 
class Pet {

    State currentState;
    static Pet createNew(){
        Pet p = new Pet();
        State s = new Sleep();
        s.setContext( p );
        p.currentState = 
        return p;
    }

    public void doSomething(){ 
        currentState.doSomething();
   }

}   

abstract class State {
    Pet context;
    void setContext( Pet c ) { 
        this.context = c;
    }
    abstract doSomething();
    void sout( Striing message ) { 
        System.out.println( message );
    }
}
class Sleep extends State { 
    public void doSomething(){
       sout( "zzzZZZ ... " );
       State nextState = new WakeUp();
       nextState.setContext( context );
       context.currentState = nextState;
    }
}
class WakeUp extends State { 
    public void doSomething(){
       sout( "uuuaaaaww... zzzz What time is it? ... " );
       State nextState = new Play();
       nextState.setContext( context );
       context.currentState = nextState;
    }
}
class Play extends State { 
    public void doSomething(){
       sout( "boing, boing, poing, poing" );
       State nextState = new Dinner();
       nextState.setContext( context );
       context.currentState = nextState;
    }
}
class Dinner extends State { 
    public void doSomething(){
       sout( "Yum, yum..." );
       State nextState = new Sleep();
       nextState.setContext( context );
       context.currentState = nextState;
    }
}

然后你的客户端类就可以使用它了

Pet myPet = Pet.createNew();

while( I_FeelLikePlaying() ){ 
    myPet.doSomething();
}
请参阅,以了解状态模式的改进版,.NET设施的优势。状态可以是一个简单的函数(大部分时间都可以),但也可以是一个对象(或另一个状态机)

问候,

安德烈亚斯