¿´µ½ÉÏÃæµÄÕâ¸ö״̬ת»»Í¼£¬Ò»°ãÀ´ËµÎÒÃÇ»¹Ïë²»µ½ÓÃ״̬»úģʽȥ½â¾ö£¬ÒòΪ̫¼òµ¥ÁË£¬¼òµ¥µÃ¿ÉÄܼ¸ÐдúÂë¾Í´¦ÀíÁË¡£
ͨ³£ÎÒÃÇÒ»°ã»áʹÓÃÏÂÃæµÄ´úÂë´¦Àí״̬»úÁ÷תµÄÐèÇó£¬
enum Event {
EVENT_LOGIN, // µÇ¼Ê¼þ
EVENT_LOGOUT, // µÇ³öʼþ
EVENT_EXPIRED, // µÇ¼¹ýÆÚʼþ
EVENT_UNKNOWN,
};
enum State {
STATE_START, // ³õʼ״̬
STATE_LOGIN, // µÇ¼״̬
STATE_UNKNOWN,
};
struct Context {
State state_;
};
void SwitchCaseMethod(Event event, Context &context) {
switch (event) {
case EVENT_LOGIN:
// do something for login event
context.state_ = STATE_LOGIN;
break;
case EVENT_LOGOUT:
// do something for logout event
context.state_ = STATE_START;
break;
case EVENT_EXPIRED:
// do something for expired event
context.state_ = STATE_START;
break;
default:
// ignore
break;
}
}
µ«ÊÇÈç¹û״̬»úµÄ¸´ÔÓ¶ÈÔö¼Óµ½ÏÂÃæÕâÑù£¬
ʹÓà switch-case д³öÀ´µÄºÜ¿ÉÄܾͻáÏñÃæÌõÒ»ÑùÁË£¬
µ±È»ÎÒÃÇÈç¹û×ö³öÊʵ±µÄ³éÏ󣬿ÉÒÔд³öÀàËÆÓÚÏÂÃæµÄ´úÂ룬
enum Event {
EVENT_LOGIN, // µÇ¼Ê¼þ
EVENT_LOGOUT, // µÇ³öʼþ
EVENT_EXPIRED, // µÇ¼¹ýÆÚʼþ
EVENT_UNKNOWN,
};
enum State {
STATE_START, // ³õʼ״̬
STATE_LOGIN, // µÇ¼״̬
STATE_UNKNOWN,
};
struct Context {
State state_;
};
typedef void (*EventHandler)(Context &context);
void LoginHandler(Context &context) {}
void LogoutHandler(Context &context) {}
void ExpiredHandler(Context &context) {}
#define TABLE_SIZE 255
EventHandler EventHandlerTable[TABLE_SIZE] = {0};
void TableDriveInit() {
EventHandlerTable[EVENT_LOGIN] = LoginHandler;
EventHandlerTable[EVENT_LOGOUT] = LogoutHandler;
EventHandlerTable[EVENT_EXPIRED] = ExpiredHandler;
}
void TableDriveMethod(Event event, Context &context) {
if (event >= TABLE_SIZE) {
return;
}
auto handler = EventHandlerTable[event];
if (NULL != handler) {
handler(context);
}
}
´úÂëµÄ¿Éά»¤ÐÔÌá¸ßÁ˺ö࣬¿´ÆðÀ´ºÜ¸É¾»¡£µ«ÊÇÈç¹ûʼþÔö¼Óµ½¼¸Ê®¸ö£¬×´Ì¬Ò²Ôö¼Óµ½¼¸Ê®¸ö£¬ÉÏÃæµÄ·½Ê½Ò²ÈÃÈ˳Բ»ÏûÁË£¬ÄÇôÎÒÃÇÐèÒªÒý³ö״̬ģʽ½â¾öÎÒÃǵÄÎÊÌâÁË¡£
״̬ģʽµÄ¶¨Òå¿ÉÒÔÔÚÕâÀïÕÒµ½£¬¿ÉÒÔ·¢ÏÖ״̬ģʽËƺõºÍÎÒÃǵĴ¦ÀíÂß¼ÓÐЩ²îÒ죬ÄǾÍÊdzéÏóµÄ״̬·½·¨Ö»ÓÐÒ»¸ö doAction£¬ºÍÎÒÃÇ login¡¢logout ºÍ expired ÓÐЩ²îÒ죬ÄÇôÎÒÃÇÖ»ÐèÒªÔö¼Ó¼¸¸ö·½·¨¼´¿É£¬¾ÍÏñÏÂÃæÕâÑù£¬
enum Event {
EVENT_LOGIN, // µÇ¼Ê¼þ
EVENT_LOGOUT, // µÇ³öʼþ
EVENT_EXPIRED, // µÇ¼¹ýÆÚʼþ
EVENT_UNKNOWN,
};
enum State {
STATE_START, // ³õʼ״̬
STATE_LOGIN, // µÇ¼״̬
STATE_UNKNOWN,
};
struct Context {
State state_;
};
class AbstractState {
public:
virtual void onLogin(Context &context) {}
virtual void onLogout(Context &context) {}
virtual void onExpired(Context &context) {}
};
class StartState : public AbstractState {
public:
virtual void onLogin(Context &context) {
// do something and transfer to new state
context.state_ = STATE_LOGIN;
}
};
class LoginState : public AbstractState {
virtual void onLogout(Context &context) {
// do something and transfer to new state
context.state_ = STATE_START;
}
virtual void onExpired(Context &context) {
// do something and transfer to new state
context.state_ = STATE_START;
}
};
ÕâÑù¾ÍÄÜÂú×ãÔÚÿ¸ö״̬ÏÂÖ»×öÕâ¸ö״̬¸ÐÐËȤµÄÊÂÇ飬ÆäËûµÄ¶¼¿ÉÒÔºöÂÔ£¬ÕâÑùÎÒÃÇÄܹ»Ó¦¶Ô´ó²¿·Ö³¡¾°¡£
ÉÏÃæÎÒÃÇËù˵µÄÄܹ»µÄÓ¦¶Ô´ó²¿·Ö³¡¾°ÑÔÍâÖ®Òâ¾ÍÊÇÓÐЩ³¡¾°»¹ÊÇÓ¦¶Ô²»ÁË£¬±ÈÈçʼþ¾³£±ä»¯µÄ³¡¾°¾ÍÐèÒª¸Ä¶¯³éÏóÀ࣬¿É²Î¿¼ spring-statemachine ¿ò¼Ü£¬¿ò¼Ü°Ñ״̬¡¢Ê¼þºÍ¶¯×÷µÄ×¢²á½øÐÐÁ˳éÏó£¬ÐÞ¸Äʱ²»ÐèÒªÐ޸ĻùÀàÖ»ÐèÒªÐÞ¸Ä×¢²áµÄʼþ¡¢×´Ì¬ºÍ¶¯×÷¡£
ÓÎÏ·È˹¤ÖÇÄܱà³Ì°¸Àý¾«´â£¬https://book.douban.com/subject/3081930/
´úÂë´óÈ«µÚÊ®°ËÕ£¬https://book.douban.com/subject/1477390//
ÖªºõÕâ¸öÎÊÌâÏÂÓкܶà¸ßÖÊÁ¿µÄ»Ø´ð£¬https://www.zhihu.com/question/31845498
ÓÐÔÞ¹¤×÷Á÷ÒýÇ棬https://tech.youzan.com/workflow-engine-in-youzan-devops/
spring-statemachine ʵ¼ù£¬/developer/article/1534194
Ô´´ÉùÃ÷£º±¾ÎÄϵ×÷ÕßÊÚȨÌÚѶÔÆ¿ª·¢ÕßÉçÇø·¢±í£¬Î´¾Ðí¿É£¬²»µÃתÔØ¡£
ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£
Ô´´ÉùÃ÷£º±¾ÎÄϵ×÷ÕßÊÚȨÌÚѶÔÆ¿ª·¢ÕßÉçÇø·¢±í£¬Î´¾Ðí¿É£¬²»µÃתÔØ¡£
ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£