学习 命令模式 -C语言,嵌入式单片机上

来源:互联网 发布:木地板品牌 知乎 编辑:程序博客网 时间:2024/06/05 15:27

 看了 feixiaoxing 的博客。感觉豁然开朗,写一下理解体会。


1. 编译改写,因为编译通不过

/////////////////////////////////////////////////////////////////////
//1.Post是一个结构体,2.包含一个函数指针do,3.这个函数的参数是这个结构体,(传进来的也是函数指针)
typedef struct OB_Post OB_Post;
typedef void  (*do_)  (OB_Post *pPost );
struct OB_Post {                     
   do_ obDo;
};


//1.command是一个结构体,里面有一个万能指针,和一个函数指针(这个函数参数是Command)
typedef struct _Command  
{  
    //void* pData;
    OB_Post * pData;
    void (*exe)(struct _Command* pCommand);  
 
}Command;


//1.boss也是一个数据结构,包含command,并有一个执行函数(参数是自己)
typedef struct _Boss  
{  
    Command* pCommand;  
    void (*call)(struct _Boss* pBoss);  
}Boss;

#if 1
//定义了一个含command的函数,相当与把上面的行为放进去.这里就把action动作分离了出来
//这个函数执行的是pPost的函数,未定义,pPost的action也是分离的,同时可以发给command来执行
void post_exe(struct _Command* pCommand)  
{  
    OB_Post  * pPost;
    //assert(NULL != pCommand);
    if(pCommand ==NULL)  return;
    pPost=(OB_Post *)(pCommand->pData);
    pPost->obDo(pPost);
   
    //(Post*)(pCommand->pData)->do((Post*)(pCommand->pData));
    //((OB_Post *)(pCommand->pData))->obDo((OB_Post *)(pCommand->pData));   
    return;  
}
#endif
//boss的一个执行函数,执行command,里面的函数
void boss_call(struct _Boss* pBoss)  
{  
    //assert(NULL != pBoss);
    if(pBoss==NULL) return;
 
    pBoss->pCommand->exe(pBoss->pCommand);  
    return;  
}
2. 进行思考,在嵌入式哪可以用到,这是很多大神没有提到的

      #if 0
void err1Action(OB_Post *pPost){/*风机开,压机关*/}
void err2Action(OB_Post *pPost){/*风机高速*/}
void err3Action(OB_Post *pPost){/*风机和压机都关*/}
OB_Post postErr1;
OB_Post postErr2;
OB_Post postErr3;
postErr1.obDo=err1Action;
postErr2.obDo=err2Action;
postErr3.obDo=err3Action;


Command   err1Cmd;
Command   err2Cmd;
Command   err3Cmd;
err1Cmd->pData=&postErr1;
err2Cmd->pData=&postErr2;
err3Cmd->pData=&postErr3;


Boss heatBoss;
Boss coolBoss;

//制热老板的命令是err1Cmd, 执行
heatBoss->pCommand=err1Cmd;
heatBoss->call(&heatBoss);
coolBoss->pCommand=err3Cmd;
coolBoss->call(&heatBoss);
#endif
/*感觉这是解决boss这一层,不让他直接操作底层,有个分隔,但对我好像没有作用
假如有一个led灯,分1.短闪,2.长闪,3,三长一短,4长一短 命令。 这个好像是个好方法
这样可以增加很多闪烁方式。
因此这个方法适合命令很多,执行很麻烦的地方。要把麻烦的隔离出来.
如果压缩机,就开,关,故障,没有用。
*/

0 0
原创粉丝点击