C語(yǔ)言設(shè)計(jì)模式之命令模式介紹
介紹:
? 命令模式是一種行為模式,它可以使代碼解耦,便于維護(hù);
假設(shè)我們現(xiàn)在要設(shè)計(jì)一個(gè)命令解析的模塊:
傳統(tǒng)方式:
void func1(void)
{
printf("func1\r\n");
}
void func2(void)
{
printf("func2\r\n");
}
void func3(void)
{
printf("func3\r\n");
}
void prase_cmd(char cmd)
{
switch(cmd)
{
case 0x01:
func1();
break;
case 0x02:
func2();
break;
case 0x03:
func3();
break;
default:
printf("cmd in invalid\r\n");
break;
}
}
傳統(tǒng)方式是使用switch-case對(duì)命令進(jìn)行一一解析的,這樣的方式隨著命令的增加,prase_cmd中的代碼量會(huì)變得越來(lái)越多,也會(huì)越來(lái)越臃腫;
而使用命令模式就可以很好的避免傳統(tǒng)模式帶來(lái)的問(wèn)題:
命令模式:
void func1(void)
{
printf("func1\r\n");
}
void func2(void)
{
printf("func2\r\n");
}
void func3(void)
{
printf("func3\r\n");
}
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)了代碼的解耦;
總結(jié)
到此這篇關(guān)于C語(yǔ)言設(shè)計(jì)模式之命令模式介紹的文章就介紹到這了,更多相關(guān)C語(yǔ)言命令模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法(路徑規(guī)劃算法)
這篇文章主要介紹了C++結(jié)合OpenCV實(shí)現(xiàn)RRT算法,RRT算法整體框架主要分為rand、near、new三點(diǎn)的建立和near與new之間的安全性檢查,需要的朋友可以參考下2022-05-05
c++標(biāo)準(zhǔn)輸入輸出流關(guān)系的前世今生
這篇文章主要給大家介紹了關(guān)于c++標(biāo)準(zhǔn)輸入輸出流關(guān)系的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
C語(yǔ)言遞歸實(shí)現(xiàn)字符串逆序的方式詳解
這篇文章主要介紹了C語(yǔ)言遞歸實(shí)現(xiàn)字符串逆序的方式詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10

