【发布时间】:2010-11-14 12:20:32
【问题描述】:
我知道访问者模式是什么以及如何使用它;这个问题不是这个one的重复。
我有一个库,其中放置了我编写的大部分可重用代码,并链接到我的大多数项目。
我经常需要向某些类添加功能,但没有将这些新功能添加到库中。让我用一个真实的例子:
在这个库中,我有一个类Shape,由CircleShape、PolygonShape 和CompositeShape 继承。
我现在正在开发一个图形应用程序,我需要在其中渲染这些 Shape,但不想将虚函数 render 放在核心 Shape 类中,因为我的一些项目使用 @ 987654329@ 不进行任何渲染,其他图形项目可以使用不同的渲染引擎(我在这个项目中使用 Qt,但对于游戏我会使用 OpenGL,因此 render 函数将需要不同的实现)。
当然,最有名的方法是使用访问者模式,但这让我产生了一些疑问:
任何库的任何类都可能需要像我的Shape 那样进行扩展。大多数公共图书馆(几乎全部)都不提供对访问者模式的任何支持;为什么?我为什么要这样做?
访问者模式是一种在 C++ 中模拟双重调度的方法。它不是 C++ 原生的,需要显式实现,使类接口更加复杂:我认为 applyVisitor 函数不应该与我的类函数处于同一级别,我认为这就像破坏抽象。
用dynamic_cast 明确地向上转换Shape 更昂贵,但对我来说它看起来是一个更清洁的解决方案。
那么,我该怎么办?在我所有的库类中实现双重调度?如果提供Shape 的库不是我的,而是网上找到的一些 GPL 库怎么办?
【问题讨论】:
-
访问者模式不是获得多次调度的方法。它需要多次分派,因此作为访问者模式的一部分,通常会向 C++ 程序员教授模拟多次分派的技术。
-
您需要多次分派吗?也许 NVI 模式适合您的需求。 NVI 设计似乎可以提供帮助,但它需要非虚拟渲染和私有虚拟 doRender 类型的方法。所以也许是 shape 和 shapecircle 之间的一个抽象类,称为 shaperenderengine。然后 ShapeCircle 可以从 shape 或 shaperenderengine 派生.....
标签: c++ visitor-pattern double-dispatch