Visitor 一个鸡肋型的模式, 属于最有争议的模式, 设计模式的设计者都将visitor排在最不推荐的模式之一。 在某些领域, visitor可以提高灵活性, 但是却又牺牲了一些别的。 本章作者介绍了visitor的特性,并用泛型实现了一个visitor.
作者的角度看来, visitor可以轻松的添加虚函数, 但是很难添加类。 使用visitor的目的是, 当不需要添加类, 却很需要添加虚函数时, 就可以应用visitor了。 在《模式与重构》书中,对visitor也有一些介绍, 认为visitor的主要目的是收集信息, 并且只有进行复杂的信息收集(从不同的类中收集)才需要visitor, 否则也可以用别的规模较小的模式代替。 本书的例子是stastics, 也属于资源收集, 从这点来看, 用法还是一致的。
为了实现visitor. 需要实现两个不同的继承体系, 分别是visited和visitor. 这两个继承体系是相对独立的。 具体的visitor实现了不同的Visit函数, 分别针对各个需要访问的visited类。 而visited需要实现一个accept(visitor&)函数. 不过这样的设计, 有一个循环依赖的问题。 visited必须知道visitor, 而visitor也必须知道visited。 虽然可以前向声明, 不过还是有点丑陋。 通过设计Acyclic Visitor, 一个新的visitor, 可以避免这种循环依赖。 方法是定义一个baseVisitor类. 这样visited就只需要知道baseVisitor就可以了,而baseVisitor只是个接口而已。具体的实现见书内。
泛化实现visitor, 基本原理还是以上visitor的原理。 不过通过提供一些抽象机制, 可以自动产生函数的定义, 利用的手段和上一章类似, 还简单不少。 最后的目的就是封装了visitor的细节,在使用的时候,可以用少量的定义就产生整个visitor结构。效率高也不容易出错,而且有很少的依赖性。 自己也没有具体在项目中使用visitor的经验,看过实现后, 并没有深刻感受。
作者的角度看来, visitor可以轻松的添加虚函数, 但是很难添加类。 使用visitor的目的是, 当不需要添加类, 却很需要添加虚函数时, 就可以应用visitor了。 在《模式与重构》书中,对visitor也有一些介绍, 认为visitor的主要目的是收集信息, 并且只有进行复杂的信息收集(从不同的类中收集)才需要visitor, 否则也可以用别的规模较小的模式代替。 本书的例子是stastics, 也属于资源收集, 从这点来看, 用法还是一致的。
为了实现visitor. 需要实现两个不同的继承体系, 分别是visited和visitor. 这两个继承体系是相对独立的。 具体的visitor实现了不同的Visit函数, 分别针对各个需要访问的visited类。 而visited需要实现一个accept(visitor&)函数. 不过这样的设计, 有一个循环依赖的问题。 visited必须知道visitor, 而visitor也必须知道visited。 虽然可以前向声明, 不过还是有点丑陋。 通过设计Acyclic Visitor, 一个新的visitor, 可以避免这种循环依赖。 方法是定义一个baseVisitor类. 这样visited就只需要知道baseVisitor就可以了,而baseVisitor只是个接口而已。具体的实现见书内。
泛化实现visitor, 基本原理还是以上visitor的原理。 不过通过提供一些抽象机制, 可以自动产生函数的定义, 利用的手段和上一章类似, 还简单不少。 最后的目的就是封装了visitor的细节,在使用的时候,可以用少量的定义就产生整个visitor结构。效率高也不容易出错,而且有很少的依赖性。 自己也没有具体在项目中使用visitor的经验,看过实现后, 并没有深刻感受。