前一篇文章中,设计了一个关于指挥灯的工作流程,采用的是 State 模式,但 Red,Green, Blue 三种状态反复的转换,每转换一次,则重新动态生成一种新的状态,浪费了大量的时间和空间。因此,在 ControlMachine 类中提前将三种状态生成,每需要生成一种新的状态时候,只需要引用提前生成的状态即可。
ControlMachine.h 源文件如下:
Light.cpp 源文件如下:
ControlMachine.cpp 源文件如下:
ControlMachine.h 源文件如下:
#ifndef _CONTROL_MACHINE_H_
#define _CONTROL_MACHINE_H_
#include " Light.h "
class Light;
class RedLight;
class GreenLight;
class BlueLight;
class ControlMachine
... {
public:
ControlMachine(Light *light);
void SetLight(Light *light);
void Push();
void Output();
RedLight *redLight;
GreenLight *greenLight;
BlueLight *blueLight;
~ControlMachine();
private:
Light* _light;
} ;
#endif
#define _CONTROL_MACHINE_H_
#include " Light.h "
class Light;
class RedLight;
class GreenLight;
class BlueLight;
class ControlMachine
... {
public:
ControlMachine(Light *light);
void SetLight(Light *light);
void Push();
void Output();
RedLight *redLight;
GreenLight *greenLight;
BlueLight *blueLight;
~ControlMachine();
private:
Light* _light;
} ;
#endif
Light.cpp 源文件如下:
void
RedLight::Push(ControlMachine
*
ctrl)
...
{
ctrl->SetLight(ctrl->greenLight);
}
void GreenLight::Push(ControlMachine * ctrl) ... {
ctrl->SetLight(ctrl->blueLight);
}
void BlueLight::Push(ControlMachine * ctrl) ... {
ctrl->SetLight(ctrl->redLight);
}
ctrl->SetLight(ctrl->greenLight);
}
void GreenLight::Push(ControlMachine * ctrl) ... {
ctrl->SetLight(ctrl->blueLight);
}
void BlueLight::Push(ControlMachine * ctrl) ... {
ctrl->SetLight(ctrl->redLight);
}
ControlMachine.cpp 源文件如下:
ControlMachine::ControlMachine(Light
*
light)
... {
_light=light;
redLight=new RedLight();
greenLight=new GreenLight();
blueLight=new BlueLight();
}
ControlMachine:: ~ ControlMachine()
... {
delete redLight;
delete blueLight;
delete greenLight;
}
... {
_light=light;
redLight=new RedLight();
greenLight=new GreenLight();
blueLight=new BlueLight();
}
ControlMachine:: ~ ControlMachine()
... {
delete redLight;
delete blueLight;
delete greenLight;
}