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

时间:2011-04-21 19:40:56

标签: c++ design-patterns coding-style

所以澄清我的问题......臭名昭着的GoF书中的每个模式 - 设计模式 可重用面向对象软件的元素 - 在C ++中有其代码示例。

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

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

2 个答案:

答案 0 :(得分:16)

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

我希望看到一些利用元编程技术的模式实现。我强烈怀疑某些模式,例如Br​​idge,Adapter和Facade,使用元编程实现起来要少得多。从另一个答案,并阅读说明,看起来Modern C++ Design: Generic Programming and Design Patterns Applied可能是这类事情的好书。我不能亲自担保。

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

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

如果指针指向由指向它的对象完全拥有的内容,请使用::std::auto_ptr(或C ++ 1x中的::std::unique_ptr)。请记住,::std::auto_ptr无法存储在STL容器中,但::std::unique_ptr没有此问题。示例可能是组件模式(只要没有共享两个子组件),Facade模式和Adapter模式。此外,工厂模式应该可能在C ++ 1x中生成::std::auto_ptr s(或::std::unique_ptr s),除非有充分理由生成::std::shared_ptr

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

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

答案 1 :(得分:10)

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

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

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

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

Modern C++ Design: Generic Programming and Design Patterns Applied