四人帮 - 设计模式 - 那些以过时方式编码的模式样本?

dan*_*uch 20 c++ design-patterns coding-style

因此,为了澄清我的问题......臭名昭着的GoF书中的每个模式 - 可重复使用的面向对象软件的设计模式元素 - 都有其C++代码示例.

这些是最新的吗?或者现在C++中的代码看起来非常不同?

我问这个,因为当我用我的上一个问题发布我的代码时,很多C++开发人员告诉我,我应该摆脱指针,那里广泛使用的指针......

Omn*_*ous 16

他们有点过时了,是的.但这些书的部分内容是这些模式在几种不同的语言中有用,并且有几种不同的风格.因此,虽然代码有点陈旧,但背后的想法却并非如此,而这些想法在这些书籍中非常重要.

我想看一些利用元编程技术的模式实现.我强烈怀疑某些模式,例如Br​​idge,Adapter和Facade,使用元编程实现起来要少得多.从另一个答案,并阅读说明,它看起来像现代C++设计:通用编程和设计模式应用可能是一个很好的书,对于这种事情.我不能亲自担保.

除了可能使用泛型编程和模板技术之外,主要区别在于,现在C++中的裸指针是一种罕见的东西.通常应该使用有效的智能指针类型,因为它们可以为您处理许多资源管理问题.坦率地说,除非你非常清楚自己在做什么,否则我不建议尝试基于通用编程的设计.

以下是在各种上下文中使用哪种智能指针的一些示例.这些示例假设您有一个包含TR1(技术报告1)扩展的C++:

当你有一个指向由指向它的对象完全拥有的东西的指针时,使用::std::auto_ptr(或::std::unique_ptr在C++ 1x中).请记住,::std::auto_ptr不能存储在STL容器中,但::std::unique_ptr没有此问题.示例可能是组件模式(只要没有共享两个子组件),Facade模式和Adapter模式.此外,工厂模式可能应该生成::std::auto_ptrs(或::std::unique_ptrC++ 1x中的s),除非有一个非常好的理由来生成::std::shared_ptrs.

如果您有指向共享所有权的内容的指针,请使用::std::tr1::shared_ptr.例如,Flyweight模式.此外,在某些情况下,组件模式也可能具有此属性.它在Bridge模式中也可能有用.

如果你有一个指向那些你没有逻辑上拥有的东西的指针,那么a ::std::tr1::weak_ptr就是你要走的路.请记住,如果您使用,::std::tr1::weak_ptr您还应该使用::std::tr1::shared_ptr所有逻辑上拥有(或共享所有权)指向项目的对象.一个例子是观察者模式.


Naw*_*waz 10

作者使用代码作为示例,而不是他们编写了生产代码.生产代码更加健壮,可检查错误和异常.这些书通常不会显示这些,也不包含try-catch块或其他业务逻辑.

本书旨在提供有关如何设计程序以解决常见软件问题的想法,概念,而不是使用的语法或代码.此外,无论作者使用原始指针,您都可以使用智能指针等替换它们(如果可能的话),以使其更加健壮.

但是,动态多态只能通过指针或引用来实现,因此它们仍然有效,甚至可以在生产代码中使用.

此外,在过去十年中,编写C++代码的方式也发生了很大变化.因此,您可以将这些新技术与GOF书中提出的旧想法/模式结合起来.例如,Andrei Alexandrescu在他的书中使用了模板来实现许多模式(模式):

现代C++设计:应用通用编程和设计模式