今天看Scott Meyers的《My Most Important C++ Aha! Moments...Ever》这篇文章(http://www.artima.com/cppsource/top_cpp_aha_moments.html),里面有一点“Understanding what problem Visitor addresses”,这个visitor模式我一直都不是非常清楚,今天再仔细看了下GOF的那本书,总结如下:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
某些场合,使用该模式之前会出现的问题:
1.在一个类型体系结构中,每一个类的接口都非常多,难以理解和修改。(比如编译器中,每一个node类型中都包含类型检查,格式化答应,流分析,代码优化等等接口)
2.增加新的操作通常需要重新编译所有这些类
visitor模式的实现
使用Visitor模式,必须定义两个类层次:一个对应于接受操作的元素(Node层次)另一
个对应于定义对元素的操作的访问者(NodeVisitor层次)。给访问者类层次增加一个新的子类
即可创建一个新的操作。但是如果要增加一个新的Node类型,则会导致NodeVisitor类层次中的所有类都必须增加一个相应的函数。
visitor适用场合
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。
当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。
使用visitor模式的好处
访问者模式使得易于增加新的操作
访问者集中相关的操作而分离无关的操作
缺点
增加新的ConcreteElement类很困难
破坏封装