介紹:
命令模式是一種行為模式,它是將具體的請(qǐng)求過(guò)程與執(zhí)行過(guò)程分開(kāi),使代碼解耦,便于維護(hù);
假設(shè)我們現(xiàn)在要設(shè)計(jì)一個(gè)命令解析的模塊:
傳統(tǒng)方式:
void func1(void){ printf("func1rn");}void func2(void){ printf("func2rn");}void func3(void){ printf("func3rn");}void prase_cmd(char cmd){ switch(cmd) { case 0x01: func1(); break; case 0x02: func2(); break; case 0x03: func3(); break; default: printf("cmd in invalidrn"); break; }}
傳統(tǒng)方式是使用switch-case對(duì)命令進(jìn)行一一解析的,將請(qǐng)求過(guò)程與執(zhí)行過(guò)程耦合在一起,這樣的方式隨著命令的增加,prase_cmd中的代碼量會(huì)變得越來(lái)越多,也會(huì)越來(lái)越臃腫;使用命令模式就可以很好的避免傳統(tǒng)模式帶來(lái)的問(wèn)題:
void func1(void){ printf("func1rn");}void func2(void){ printf("func2rn");}void func3(void){ printf("func3rn");}typedef void (*cmd_func) (void);typedef struct{ int cmd; cmd_func func;}cmd_t;static cmd_t cmd_table[] ={ {0x01, func1}, {0x02, func2}, {0x03, func3},};void prase_cmd(int cmd){ for(int index = 0; index < sizeof(cmd_table) / sizeof(cmd_t); index++) { if(cmd_table[index].cmd == cmd) { cmd_table[index].func(); return; } }}
通過(guò)命令模式,我們可以很好的進(jìn)行代碼的維護(hù)與拓展,我們只需要對(duì)cmd_table進(jìn)行維護(hù)即可,無(wú)需再關(guān)注prase_cmd里的內(nèi)容,實(shí)現(xiàn)了代碼的解耦;