首先说一下visitor模式, 下面是一些大家之言:
1.Visitor模式是对在多个抽象的对象群的一种特殊处理,适合在这样一个场景:有一堆身份各异对象(通常是数据状态类),这些状态类有一些特征:被动的(数据都是被动的),需要等待外界来操作或推动。那么现在外界有一个动作来准备操作这些状态类了,但是走到面前,突然傻眼,分不清楚谁是谁啊?这些状态类可能属于不同类型的接口,怎么办?解决思路,当然把这些状态类再统一到一个接口下就可以操作了。当然,这时需要这些状态类做些修饰,有个“对外开放”的姿态,再实现一个统一接口Visitable,这个接口中提供的方法就更抽象:Accept()。其实Accept方法的具体实现是采取了Adapter模式,因为各个状态类都分属不同的接口,总不能为接受访问修改这些接口吧。
2.visitor用多态去掉了这个type switch,并且遵循ocp, 用“容易添加新类”这个“你不需要的优势”来换取“容易添加新的方法”这个“你需要的优势”。
OSG中的NodeVisitor是对访问器(visitor)模式思想的具体实现。 从本质上说,NodeVisitor类遍历了一个场景图形并为每一个被访问节点调用特定的函数。
在OSG中的visitor最关键的两个函数是apply函数,该函数决定了遍历的方式,例如可以获得各个节点的属性,也可以修改节点的属性,这完全取决于apply函数的实现,用户可以创建新的继承于NodeVisitor的类,重写apply函数,apply函数的调用对用户是透明的,用户根本不用关心;另外一个就是accept函数,用户调用该函数可以关联访问器与要访问的对象。
以下并不想具体介绍OSG中的源代码,因为实在是太庞大了,下面只是OSG中的visitor的模型:
下面是有关OSG中的visitor关系图:
- add 2013/7/31 dizuo
OCP: open close principle 开-闭原则
访问器模式:通过继承方式增加新的接口,工厂模式:通过继承的方式实现虚构造函数!