看visitor模式的感受

03-03-30 VRGL
就是提倡用多态,

而不是RTTI。

1
lsj
2003-03-30 17:39
RTTI的威力真是不小,能用多态取代它吗?

banq
2003-03-31 14:33
to VRGL

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

richardluopeng
2003-03-31 14:34
java中不能

VRGL
2003-03-31 18:39
在访问一个类继承结构的时候,

容易使用rtti来type switch,

而visitor用多态去掉了这个type switch,

并且遵循ocp,

用“容易添加新类”这个“你不需要的优势”

来换取“容易添加新的方法”这个“你需要的优势”。

banq
2003-04-01 11:31

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

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

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

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

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

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

解决思路,当然把这些状态类再统一到一个接口下就可以操作了。

当然,这时需要这些状态类做些修饰,有个“对外开放”的姿态,再实现一个统一接口Visitable,这个接口中提供的方法就更抽象:Accept()。

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

VRGL
2003-04-01 14:26
visitor模式的最主要的用途是

对已有类继承结构的访问,而不

是对新的一组软件结构。

设计模式最主要的建议是采用

多态代替switch,visitor就是

采用多态来代替type switch,

用RTTI来type switch是不符合

面向对象的原则的,这也是visitor

模式的真正用意:将多态和ocp结合

起来。

wwlhp@jdon.com
2003-06-08 14:49
bang分析得非常有道理

bruce
2003-06-13 09:12
有一种看法不知对不对,

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

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

wwlhp@jdon.com
2003-06-24 08:42
最近我在看JUnit的文档时,意外的发现了大师对于访问者模式双重分派的看法:

The idea behind double dispatch is to use an aditional call to discover the kind of argument we are dealing with.

bruce
2003-06-24 09:12
wwlhp@jdon.com

好久不见了.

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

mountebank
2003-12-09 11:23
banq的解释令我有恍然大悟之感,这和com中IUnkown接口中的queryinterface方法是不是很像呢?

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

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

freebox
2008-07-20 19:06
我觉得visitor要求对象集得是“人”数的,对象集容量太大就不是人能用的了。

猜你喜欢