作者: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就是其中之一。
- void qsort(void *base, size_t nmemb, size_t size,
-
int(*compar)(const void *, const void *));
参数compar为一个函数指针,由调用者定义其比较函数,而C库的qsort使用compar进行快速排序。因为快速排序本身是“固定不变”的,那么这里就通过一个简单的函数指针,完成了“变化”的比较算法的抽离。
Note:
对于设计模式,我一直认为不要去生搬硬套的去使用设计模式,更无需去记住哪个模式的名字是什么,特性是什么。无论是什么语言,我们只需记住封装变化,保持灵活。设计模式要信手拈来,领会思想,灵活使用。
参考:
1. 《设计模式——可复用面向对象软件的基础》
2. 《Head First 设计模式》
阅读(707) | 评论(0) | 转发(0) |