看visitor模式的感受

就是提倡用多态,
而不是RTTI。

RTTI的威力真是不小,能用多态取代它吗?

to VRGL
两句话很抽象,我没能一下子明白,能仔细讲一下吗?反正大家都是讨论,讨论越多,学到的东西就越多。

java中不能

在访问一个类继承结构的时候,
容易使用rtti来type switch,
而visitor用多态去掉了这个type switch,
并且遵循ocp,
用“容易添加新类”这个“你不需要的优势”
来换取“容易添加新的方法”这个“你需要的优势”。


在很多场合,我们使用RTTI实际是为了达到更加抽象的目的,但是抽象本身的一个问题就是无法从抽象中找到“原来的我”了。

比如一个接口抽象了很多具体的继承类,在很多地方我们都是和接口直接打交道,这样做的前提是必须在接口中声明所有需要使用的方法,这样做可以对付大部分问题。

以上是关于接口的多态,这样做的前提是,所有对象都是继承同一个接口,如果对象分属不同的抽象接口,怎么做?

Visitor模式是对在多个抽象的对象群的一种特殊处理,适合在这样一个场景:

有一堆身份各异对象(通常是数据状态类),这些状态类有一些特征:被动的(数据都是被动的),需要等待外界来操作或推动。

那么现在外界有一个动作来准备操作这些状态类了,但是走到面前,突然傻眼,分不清楚谁是谁啊?这些状态类可能属于不同类型的接口,怎么办?

解决思路,当然把这些状态类再统一到一个接口下就可以操作了。
当然,这时需要这些状态类做些修饰,有个“对外开放”的姿态,再实现一个统一接口Visitable,这个接口中提供的方法就更抽象:Accept()。

其实Accept方法的具体实现是采取了Adapter模式,因为各个状态类都分属不同的接口,总不能为接受访问修改这些接口吧?


visitor模式的最主要的用途是
对已有类继承结构的访问,而不
是对新的一组软件结构。
设计模式最主要的建议是采用
多态代替switch,visitor就是
采用多态来代替type switch,
用RTTI来type switch是不符合
面向对象的原则的,这也是visitor
模式的真正用意:将多态和ocp结合
起来。

bang分析得非常有道理

有一种看法不知对不对,

咱们可不可以把从接口Visitable 实现的子类看成是具有单一功能的Facade,当然更正规的说法应是delegation. 我只是想从模式变换的角度去看Visitor模式。

很想听听各位同仁们的意见。

最近我在看JUnit的文档时,意外的发现了大师对于访问者模式双重分派的看法:
The idea behind double dispatch is to use an aditional call to discover the kind of argument we are dealing with.

wwlhp@jdon.com

好久不见了.

不过觉得这位大师也没什么新的看法. 还是Banq说的更清楚, 别说我拍..,我只是实事求是, 哇,有鸡蛋过来了, 我闪.

banq的解释令我有恍然大悟之感,这和com中IUnkown接口中的queryinterface方法是不是很像呢?

我觉得Visitor模式中Visitor子类的visit方法是整个模式的核心,但始终没有搞明白Visitor到底应该怎么用。:( 是否时客户端维护一个包含visitable的聚集,然后依次调用起accept方法?哪位能给出个具体的实例?

我看了访问者模式,也理解这个模式,但我不知道什么场合使用,所以我觉得自己没有真正理解这个模式,谁能说说什么场合使用,最好说名在项目中什么时候可能用到.

我觉得visitor要求对象集得是“人”数的,对象集容量太大就不是人能用的了。