挖井

类库大魔王的挖井日记

挖一口属于自己的井


template method果然安逸

  今天去把那几个函数重构了,第一印象中用template method pattern是可以解决的,于是翻了下GoF,里面对template method的描述基本没出我的意料之外,还是可以理解的,不过可能是受限于当年的C++技术水平,也可能是其他未道明的原因,GoF中说是在派生类中用覆盖方法实现的。
  我却认定了要用callback,因为我想用boost.function和boost.bind,于是三两下就搞好了,果然很简单,而且仔细想想,似乎相比用继承的方法实现,我现在的方案有一个优点是,可以把可变逻辑控制在更小的粒度上。比如本来我是一个算法的几个步骤,其中一个步骤是调用STL中的算法,而该算法需要一个谓词,这个谓词是可变的量,该谓词要被提取出来,这可以通过boost.function和boost.bind实现得像一个closure一样,在template method的领域内不需要知道谓词的具体实现形式,它只知道它接受一个boost.function,该function接受一个参数,之后返回一个值,至于到底是用functor实现,还是C global function实现,或是C++ class static function实现等等,它不需要关注,因为boost.function会打理好一切。而如果是用继承的方法实现,可能我就需要把那整个调用STL算法的步骤提取出来了,这样粒度就大了,就削弱了原本使用template method的意图和优势了。另外还有一种方案,还是用继承,只把谓词逻辑提取出来,STL算法调用时,用boost.bind来封装,但我想这是行不通的,因为编译期并不知道要调用哪个派生类的方法。
  用boost.function和boost.bind实现template method果然安逸,design pattern果然只是一种思想,而不受限于实现,哈哈!

本文地址:

https://minidump.info/blog/2008/12/template-method-e6-9e-9c-e7-84-b6-e5-ae-89-e9-80-b8/

感觉本文不错,不妨小额鼓励我一下!
上一篇

加多4个tab页

  今天整了一天,把原来的一个列表,整成了5个tab页分成的5个列表,每个列表显示不同的内容。  这次是深切体会到当初设计的草率,把许多应该放在文档类中的数据成员和方法都放到视图类去了,结果现在本来还是同一份数据,要给多个视图共享使用时,就需要大量的修改。  不过这样的修改从长远看来,说不定是...…

Job 全文阅读
下一篇

用wiki记录开发文档

  前天,公司请MS的人来做交流,我也去听了一下,虽然只听懂了20%~30%,还有有翻译,尽管翻译的水平不咋的,连蒙带猜的大致上也能搞明白他在讲什么。其中让我印象最深感触最深的一个实践,是用wiki记录开发文档,其他人也可以修改文档,有新人加入时,就可以通过wiki进行学习,我深以为然。  昨...…

Job 全文阅读