有效地访问对象模型中的父元素

时间:2008-11-20 18:44:54

标签: xml language-agnostic design-patterns dom

我有以下对象模型:

- Book 
-- Chapter 1
--- Page 1
---- Image 1 
---- Image 2
---- Text 1
--- Page 2 
...

资源在页面级别下降。但是,从资源的角度来看,我需要知道资源的完整路径。

一种方法是让资源了解他们的父母。

所以我的Image对象可以有一个“parentPage”属性,而该属性又可以有一个“parentChapter”属性。这样,我可以通过currentImage.parentPage.parentChapter访问完整路径。还有更好的方法吗?

关于为什么我需要从资源的角度了解完整路径的几句话。我有一个在屏幕上行走和渲染的对象模型。渲染器从章级别一直下降到元素/资源级别(这是渲染发生的位置)。但是为了显示资源,我需要知道它们的存在位置(即磁盘上的实际路径),这些信息通常在章节级别指定。

谢谢!

- 编辑 - 只是为了澄清,这个parent.parent方法是最好的吗?它迫使儿童对象了解父母,这让我感到不舒服。耦合?

4 个答案:

答案 0 :(得分:6)

我建议使用树结构,而每个类都继承自树节点。

c#中的示例:

class TreeNode {
 public TreeNode Parent { get; set; }
 public List<TreeNode> Children { get; set; }
}

class Book : TreeNode {
 ... book attributes ...
}

... other classes ...

实际上,如果你担心要把自己联系起来问问自己是好的耦合还是坏耦合?如果耦合实际上增加了价值并且有合理的理由去做,那就去做吧。如果没有,那就浪费了代码。如果您使用支持泛型的语言,则可以将其分离得更远:

class TreeNode<TParent, TChild>  
{
    public TParent Parent { get; set; }
    public List<TChild> Children { get; set; }
}

class Book : TreeNode<object, Chapter> { }
class Chapter : TreeNode<Book, Page> { }
class Page : TreeNode<Chapter, object> { }

希望有所帮助!

答案 1 :(得分:2)

你是否使用Zachary的树结构,或者你是以更具特定类型的方式进行的,关于耦合生活的问题。

如果有很多关于图像与页面中“托管”图像无关的图像,您可能希望使用具有上下文相关方面且包含图像实例(参考)。

只有您可以决定是否过多,具体取决于应用程序以及减少耦合的重要性,并允许在其他情况下更多地重用某些成分。

答案 2 :(得分:0)

听起来你想要doubly-linked list或甚至可能考虑使用tree structure

答案 3 :(得分:0)

您可以将对象序列化为xml并使用linq to xml来解析信息。

如果必须使用对象的实例,另一个选项可能是查看复合模式(see wikipedia

埃里克

相关问题