Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2776401
  • 博文数量: 505
  • 博客积分: 1552
  • 博客等级: 上尉
  • 技术积分: 2514
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-23 18:24
文章分类

全部博文(505)

文章存档

2019年(12)

2018年(15)

2017年(1)

2016年(17)

2015年(14)

2014年(93)

2013年(233)

2012年(108)

2011年(1)

2009年(11)

分类: C/C++

2013-04-18 10:26:29

作者:gfree.wind@gmail.com
博客:blog.focus-linux.net     linuxfocus.blog.chinaunix.net

在一般的设计模式的书籍中,大都是使用面向对象语言来介绍设计模式。虽然设计模式从语义上与面向对象的编程语言更贴近,但是对于面向过程的C语言来说,同样可以吸收设计模式的思想,在C语言中,使用和实现设计模式。其实,在很多的C语言代码中,就已经体现了设计模式的思路。

就我理解,设计模式本身就是为了封装变化或者隔离变化。将变化的代码或者算法,抽离出来,保证其他模块的稳定性。那么对于这种思想,在C的使用中,同样也适用。所以我想再把经典的一些设计模式过一遍,看看其在C语言中的应用。


今天首先是策略模式。

策略模式的定义:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于是使用算法的客户。

从定义中可以看出,对于策略模式来说,算法的实现是可变的,封装的就是这个“变化”的算法。注意,这里的算法,并不是狭义的算法,可以将其理解为实现某一目的的实现。

C++中的STL的迭代器iterator的迭代过程,就应用了策略模式。至于容器是vector, map还是set,都无所谓,只要容器提供了接口begin(), end(), 和重载的++运算符的实现。整个儿迭代过程就是for (iterator = container.begin; iterator != container.end; ++iterator),至于++iterator是如何实现的,迭代运算并不关心。这里封装的算法就是begin(), end()和重载的++运算。而算法的使用者就是迭代过程。

上面是面向对象的C++使用策略模式的应用场景。而C中其实对于策略模式的应用也很广泛。就拿C库来说,qsort就是其中之一。
  1. void qsort(void *base, size_t nmemb, size_t size,
  2.                   int(*compar)(const void *, const void *));
参数compar为一个函数指针,由调用者定义其比较函数,而C库的qsort使用compar进行快速排序。因为快速排序本身是“固定不变”的,那么这里就通过一个简单的函数指针,完成了“变化”的比较算法的抽离。


Note:
对于设计模式,我一直认为不要去生搬硬套的去使用设计模式,更无需去记住哪个模式的名字是什么,特性是什么。无论是什么语言,我们只需记住封装变化,保持灵活。设计模式要信手拈来,领会思想,灵活使用。

参考:
1. 《设计模式——可复用面向对象软件的基础》
2. 《Head First 设计模式》

阅读(694) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~