osg::CopyOp类 访问者模式(Visitor Pattern)的一处具现

    先概括一下访问者模式:访问者模式有很好的解耦作用,他可以实现C++语言本身所不具备的二次派发(Double Dispatch)功能,在同类型(有共同基类)且有组织(通常是树形结构)中穿梭(遍历),并且在不改变原有类代码的情况下增加新功能

    如果要加深学习访问者模式可以仔细阅读osg::NodeVisitor类,以及结合实例看的用法。


    接下来解释一下osg::CopyOp类,就可自行理解为何要用访问者模式。

    osg::CopyOp类出现在osg::Object类clone方法、拷贝构造方法,osg命名空间下clone函数的形参中。其维护一种拷贝方式标识CopyFlags,表明本对象可拷贝的内容(通过逻辑运算可组合多个内容),也是构造一个CopyOp对象所必需的参数。那么都要设置哪些标识,为什么设置这些标识呢?因为拷贝主要针对场景树中的元素,场景树的元素主要由节点和节点属性构成,在拷贝过程中根据深拷贝和浅拷贝的思想可以有选择的拷贝目标或是直接引用同一个目标。

    到此,已经看出作为访问者模式osg::CopyOp类所要增加的功能了----复制节点。那么他的另一个遍历功能是如何实现的呢?只要捋顺一下代码就明了了:首先调用osg::clone复制当前节点,然后用osg::CopyOp来处理其子节点和每个节点所有的属性,osg::CopyOp中的operator方法又调用了osg::clone方法,这样两个方法之间形成了递归调用完成遍历。而osg::CopyOp对象始终伴随传递,遍历过程中遵循统一的CopyFlags,即对每一个节点的处理判断条件统一。

    最后,如果你想在遍历过程中处理增加操作,可继承osg::CopyOp类,重写operator方法,这样遍历到某一个类型节点或属性的时候,你可以根据自己的需要增加处理代码。

    这就是osg::CopyOp和他的访问者模式。

    


转载于:https://my.oschina.net/u/1396778/blog/345023

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值