问题描述
Eric Gamma的“设计模式”书解释说,复合结构可以声明操作:
此类操作由非叶运算符递归传播。
另一方面,通过使用访客设计模式来创建访问组合结构并进行操作的访客,我们可能会得到相同的结果。
那么,为什么有人会选择在组合中添加一个操作而不是为每个所需的操作创建一个新的访问者呢?反之亦然?
解决方法
我不会描述这些模式的含义,已经有许多出色的descriptions。但是我会说这些模式相互补充。访问者允许我们添加新操作而不更改可以执行这些操作的对象的类,但是如果我们可以更改这些类,则可以在不使用访问者的情况下向其添加新操作都取决于上下文。
有时在开发阶段我们无法预测对复合对象执行的操作,但是我们可以通过在复合对象的界面上添加accept()
方法来提供将来添加此类功能的可能性它采用访问者的界面并为当前对象调用其visit()
方法。