我已经阅读了有关访客模式https://softwareengineering.stackexchange.com/questions/132403/should-i-use-friend-classes-in-c-to-allow-access-to-hidden-members的问题。在我读过的其中一个答案中
访问者使您能够在不实际触及类本身的情况下向类添加功能。
但是在访问过的对象中我们必须添加新的界面,所以我们实际上是"触摸"这个类(或者至少在某些情况下放置setter和getter,也改变了类)。
我将如何在不更改访问类别的情况下为访问者添加功能?
答案 0 :(得分:1)
访问者模式确实假设每个类接口都足够通用,因此,如果您知道对象的实际类型,则可以从类外部执行操作。如果这不是起点,访客确实可能不适用。
(请注意,这个假设相对较弱 - 例如,如果每个数据成员都有一个getter,那么对于任何const操作都可以轻松实现。)
这种模式的焦点是不同的。如果
这是起点
您需要支持越来越多的操作
然后,为了将应用于指针(或引用)的新操作分派给基类,您需要对类的代码进行哪些更改。
为了使其更具体,请选择classic visitor CAD example:
考虑2D CAD系统的设计。在其核心有几种类型来表示基本的几何形状,如圆形,线条和弧形。实体按层排序,在类型层次结构的顶部是绘图,它只是一个层列表,加上一些其他属性。
此类型层次结构的基本操作是将绘图保存为系统的本机文件格式。乍一看,将本地保存方法添加到层次结构中的所有类型似乎是可以接受的。但是,我们还希望能够将图形保存为其他文件格式,并且添加越来越多的方法来保存大量不同的文件格式,这很快就会混淆我们开始使用的相对纯粹的几何数据结构。
访客模式的起点是,例如,圆圈,具有足够的吸气剂用于其细节,例如其半径。如果情况并非如此,那么确实存在问题(事实上,它可能是一个设计糟糕的CAD代码库)。
从这一点开始,在考虑新操作时,例如写入文件类型A,有两种方法:
为每个班级和每项操作实施virtual
方法write_to_file_type_a
仅为每个班级实施virtual
方法accept_visitor
,仅一次
在你的问题中“没有真正触及课程本身”意味着,在上面的第2点,这就是现在将所有访问者分配到正确课程所需的全部内容。例如,这并不意味着访客会开始写吸气剂。
答案 1 :(得分:0)
为一个目的编写访问者界面后,您可以通过不同方式访问该课程。不同的访问不需要再次触及类,假设您正在访问相同的组件。