介紹:
指令模式
是一種行為模式,它可以使代碼解耦,便于維護;
假設我們現在要設計一個指令解析的子產品:
傳統方式:
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;
}
}
傳統方式是使用
switch-case
對指令進行一一解析的,這樣的方式随着指令的增加,
prase_cmd
中的代碼量會變得越來越多,也會越來越臃腫;
而使用指令模式就可以很好的避免傳統模式帶來的問題:
指令模式:
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;
}
}
}
通過指令模式,我們可以很好的進行代碼的維護與拓展,我們隻需要對
cmd_table
進行維護即可,無需再關注
prase_cmd
裡的内容,實作了代碼的解耦;