Tem*_*Rex 24
"设计模式是针对您的编程语言的错误报告" - Peter Norvig
为了回答为什么没有很多C++设计模式库的问题,首先要知道哪些设计模式要解决.经典的GoF书在序言中说明
设计模式描述了面向对象软件设计中特定问题的简单而优雅的解决方案.
90年代的面向对象编程风格在很大程度上依赖于使用抽象类作为接口,具体实现类来自这些接口.GoF模式描述了不同类类型的对象之间的创建,结构和行为关系.它们的关键元素是:封装和参数化经常变化的任何东西.许多GoF模式也可以使用模板重新构造,但是灵活性受限于编译时而不是运行时.
面向对象的编程使得添加接口的不同具体实现变得非常容易.OOP很难为现有界面添加新功能.该访问者模式就是最好的例子:它本质上是一个变通依靠额外的间接水平,使新算法对现有的数据结构的工作.
这与函数式编程完全相反:使用函数式编程可以很容易地为现有数据添加新函数,但是添加这些函数所适用的新数据类型要困难得多.在函数和类型中获得可扩展性的困难称为表达式问题.
OOP样式多态性主要基于内部多态性:动态函数调度基于对象的类型.Modern C++还使用外部多态,其中类型擦除等技术允许使用静态接口实现运行时灵活性.新的std::shared_ptr和boost::any或adobe::poly类是这些技术的主要例子.
Tobias Darm最近的一次ACCU演讲展示了许多将旧的内部多面体GoF模式转换为这种新型外部多态模式的例子.粗略的想法是用一个可以std::function作为参数的函数参数替换抽象类.所述std::function然后控制来自外部的多晶型的灵活性.通过这种方式,许多GoF模式可以大大增强样板.
TL; DR:经典的GoF模式是为解决OOP缺点而量身定制的.但是OOP不再是主流的C++风格.通用编程(标准库,Boost)和OOP的组合可以更优雅地解决许多问题,使得经典设计模式不再是首选解决方案.
mic*_*ion 17
设计模式的原始定义是对可能无法方便地封装在库中的重复出现问题的可重用方法.因此,在我可以将模式封装在库中的那一刻,它不再是一种模式.例如,这主要发生在C++中的迭代器中,因为标准C++库现在有一个用于实现迭代器的综合框架.
我从来没有尝试过使用Loki,但是阅读Alexandrescu的书,我并不相信基于库的方法真的可以提供很多模式.