Xiao Peng

My personal blog moves to xiaopeng.me , blogs about design patterns will be synced to here.
肖鹏,ThoughtWorks资深咨询师,目前关注于架构模式、敏捷软件开发等领域,并致力于软件开发最佳实践的推广和应用。
多次为国内大型企业敏捷组织转型提供咨询和培训服务,在大型团队持续集成方面具有丰富的经验。
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

使用Visitor模式的现实问题(请教)

Posted on 2007-01-03 23:24  勇敢的鸵鸟  阅读(431)  评论(0编辑  收藏  举报

选择放在首页一方面是希望更多的朋友可以帮助我,另一方面我觉得这个案例有一定的典型性。如果大家(特别是DUDU)认为不妥请告诉我,我撤下来。

背景:遍历一个图(有若干元素组成,每个元素称为一个Shape,元素之间由Connector相连)生成相应的XML文件。每个元素生成一段XML代码,最后组合在一起。单看背景部分,这是一个典型的外部收集方法的案例,使用Visitor模式也比较合适。
实现现状:使用Visitor模式(见下图),ObjectStructure负责遍历所有的Shape(不必关心Connector,由另一个类负责装配ObjectStructure,这里假定可以顺利的遍历)。Visitor中包含一个XmlElement收集从各个shape获得的数据。
问题:Visitor每次访问一个Shape会为这个shape分配一个ID。有一种特殊的Shape,它需要自己的下一个Shape的ID作为自己的属性(nextShapeID)。也就是说,我们需要首先访问它的nextShape(这时会为这个shape分配一个ID),然后把下一个Shape的ID作为自己的属性(注意这个ID是动态产生的)才能够产生自己对应的XML代码。这就存在一个矛盾,对Shape的循环不是Visitor能够控制而是由ObjectStructure控制,而Visit这个特殊的Shape的时候却需要临时改变遍历的策略。
大家帮我想想办法,不一定束缚在Vistor上。