如何开发网站自己做站长,挣钱做任务的网站,永修建设局网站,高端网站建设策划模式动机在嵌入式的应用场景中#xff0c;管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后#xff0c;还必须释放资源。例如fopen()打开文件后#xff0c;必须要使用fclose()来关闭文件#xff0c;而使用malloc申请内存资源后#xff0c;就… 模式动机在嵌入式的应用场景中管理资源(例如文件、内存)是一件非常麻烦、非常容易出错的事情。因为在分配资源后还必须释放资源。例如fopen()打开文件后必须要使用fclose()来关闭文件而使用malloc申请内存资源后就必须使用free()函数来释放内存。在实际开发工作中稍微对malloc不注意就会导致内存泄漏。而模板方法模式堪称预防这类低级错误的神器!场景案例场景:现在硬盘卡上存放了多部电影我们需要在电脑上随机读取播放。假设我们动态申请1G的内存空间来存放视频如果女主是美女那么正常播放视频播放完后退出程序。如果女主长相感人则立马退出程序传统实现的伪代码如下:...
int main()
{
...
//申请1G内存
p_movie malloc(1G);
//读取sd卡视频并存放在p_movie中
...
//根据电影类型来选择播放方式
if(p_movie 美女)
{..._/正常播放电影
}
else if (p_movie 长相感人)
{..._/停止播放电影//释放内存free(p_movie);return -1;
}
//释放内存
free(p_movie);
return 0;}
在上面的代码实现中管理内存和使用内存的代码耦合在一起。在每个分支情况里面必须时刻注意内存的使用和释放情况(比如在本例中free函数就出现了两次)。随着各种程序中的分支越来越多、越来越庞大有时候很容易忽略对内存的释放从而引起内存泄漏。解决方案编写类似这种资源处理相关的代码之所以很麻烦是因为资源管理和资源使用的代码耦合在一起了我们只要通过定义一个模板方法函数来分离这两部分的代码就可以避免它们各种复杂的组合情况处理了。请看下面伪代码://资源使用代码
int act_movie(char* p)
{if(p 美女){..._/正常播放电影}else if (p 长相感人){..._/停止播放电影return -1;}return 0;
}
//定义模板方法函数负责资源管理
int template(int (*play_movie)(char* p)
{int ret;//申请1G内存p_movie malloc(1G);//读取sd卡视频并存放在p_movie中...//根据电影类型来选择播放方式ret play_movie(p_movie);//释放内存free(p_movie);return ret;}int main()
{
int ret;
...
//调用模板方法函数
ret template(act_movie);
...
return ret;
}
在上面的代码实现中我们通过定义一个模板函数使得资源的分配和释放都统一在模板函数中完成了避免了分配资源后容易忘记释放的问题。在资源使用过程中可以更专注于业务逻辑的实现各函数的职责更加清晰。内存的分配释放可能会在代码中多次出现。这时只需要简单地调用模板方法函数即可一定程度上减少了代码重复。而以后资源的使用场景发生变化的话也只要再新增一个类似act_movie的函数即可。总结这就是c语言中的模板方法模式重点在于封装不变部分扩展可变部分。对不变部分合理封装既可以预防程序出错也可以提取公众部分代码减少代码重复。来源embed linux share