访客模式添加新功能

时间:2016-10-01 15:44:44

标签: c++ visitor

我已经阅读了有关访客模式https://softwareengineering.stackexchange.com/questions/132403/should-i-use-friend-classes-in-c-to-allow-access-to-hidden-members的问题。在我读过的其中一个答案中

  

访问者使您能够在不实际触及类本身的情况下向类添加功能。

但是在访问过的对象中我们必须添加新的界面,所以我们实际上是"触摸"这个类(或者至少在某些情况下放置setter和getter,也改变了类)。

我将如何在不更改访问类别的情况下为访问者添加功能?

2 个答案:

答案 0 :(得分:1)

访问者模式确实假设每个类接口都足够通用,因此,如果您知道对象的实际类型,则可以从类外部执行操作。如果这不是起点,访客确实可能不适用。

(请注意,这个假设相对较弱 - 例如,如果每个数据成员都有一个getter,那么对于任何const操作都可以轻松实现。)

这种模式的焦点是不同的。如果

  1. 这是起点

  2. 您需要支持越来越多的操作

  3. 然后,为了将应用于指针(或引用)的新操作分派给基类,您需要对类的代码进行哪些更改。

    为了使其更具体,请选择classic visitor CAD example

      

    考虑2D CAD系统的设计。在其核心有几种类型来表示基本的几何形状,如圆形,线条和弧形。实体按层排序,在类型层次结构的顶部是绘图,它只是一个层列表,加上一些其他属性。

         

    此类型层次结构的基本操作是将绘图保存为系统的本机文件格式。乍一看,将本地保存方法添加到层次结构中的所有类型似乎是可以接受的。但是,我们还希望能够将图形保存为其他文件格式,并且添加越来越多的方法来保存大量不同的文件格式,这很快就会混淆我们开始使用的相对纯粹的几何数据结构。

    访客模式的起点是,例如,圆圈,具有足够的吸气剂用于其细节,例如其半径。如果情况并非如此,那么确实存在问题(事实上,它可能是一个设计糟糕的CAD代码库)。

    从这一点开始,在考虑新操作时,例如写入文件类型A,有两种方法:

    1. 为每个班级和每项操作实施virtual方法write_to_file_type_a

    2. 仅为每个班级实施virtual方法accept_visitor,仅一次

    3. 在你的问题中“没有真正触及课程本身”意味着,在上面的第2点,这就是现在将所有访问者分配到正确课程所需的全部内容。例如,这并不意味着访客会开始写吸气剂。

答案 1 :(得分:0)

为一个目的编写访问者界面后,您可以通过不同方式访问该课程。不同的访问不需要再次触及,假设您正在访问相同的组件。