Modern c++ design 第十章

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的经验,看过实现后, 并没有深刻感受。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值