介紹:
命令模式是一種行為模式,它是將具體的請求過程與執(zhí)行過程分開,使代碼解耦,便于維護(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對命令進(jìn)行一一解析的,將請求過程與執(zhí)行過程耦合在一起,這樣的方式隨著命令的增加,prase_cmd中的代碼量會變得越來越多,也會越來越臃腫;使用命令模式就可以很好的避免傳統(tǒng)模式帶來的問題:
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; } }}
通過命令模式,我們可以很好的進(jìn)行代碼的維護(hù)與拓展,我們只需要對cmd_table進(jìn)行維護(hù)即可,無需再關(guān)注prase_cmd里的內(nèi)容,實(shí)現(xiàn)了代碼的解耦;