Design patterns 实现状态驱动类
假设需要实现一个类“CAR” 现在,该类包含各种状态,如“未点燃”、“点燃”、“故障”、“刺穿”等 实现这一要求的方法是在类中使用布尔标志,即“属性”,并在每个成员函数中使用这些布尔标志“检查状态”。比如说, CAR.goRacing() { if(bIsPunctured) return ENUM_CANT_DRIVE; //Start the Engine... } 汽车 { 如果(双穿孔) 返回ENUM\u CANT\u驱动器; //启动引擎。。。 } 当对象暴露的状态数量增加时,这个实现看起来很简单,但开始变得非常复杂。我也看到过这样的情况,即单个状态会使对象的维护变得非常麻烦(我确信在这种情况下,我的编程技能要怪我)Design patterns 实现状态驱动类,design-patterns,class,Design Patterns,Class,假设需要实现一个类“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设施的优势。状态可以是一个简单的函数(大部分时间都可以),但也可以是一个对象(或另一个状态机)
问候,
安德烈亚斯