2

我正在设计一个网站导航层次结构。它是一棵节点树。

大多数节点都是页面。一些节点是链接(想想 Windows 中的快捷方式)。

大多数页面都包含 HTML 内容。一些执行代码。

我想将这些表示为这个类和抽象(MustInherit)类的集合......

类图

这是我要存储所有这些的数据库表……

数据库表 http://img178.imageshack.us/img178/8573/nodetablefm8.gif

这就是我难过的地方。PageNodes 可能是也可能不是根。

我应该如何处理根类?

类图

我不想拥有所有四个……

  • HtmlPageNode
  • 代码页节点
  • Html页面节点
  • 代码页面节点

我希望 HtmlPageNode 和 CodePageNode 类从 PageNode从 RootPageNode 继承。那可能吗?


澄清:有多个根节点,根可能有父节点。每个都是唯一具有不同样式的子树的根。想想不同的、颜色编码的部门。(也许 root 是一个糟糕的名称选择。建议?)


更新:关于“根”名称......
我问过:是否有对应于子树的节点的特定名称?

4

6 回答 6

2

如前所述,复合模式可能是一个很好的解决方案。

如果这对您不起作用,那么将 Root 定义为接口并根据需要应用它可能会更简单(如果合适的话)。

当然,这不会让您为 Root 提供任何实现......
如果 Root 必须有实现,您可以使用装饰器模式。

于 2008-09-17T16:18:33.110 回答
2

使用复合模式


关于您的根节点,是否存在功能差异或完全外观上的差异?如果差异只是外观,我建议您与 PageNode 中的单独样式类关联。

如果功能上存在差异并且您有很多类型的页面,那么请考虑使用装饰器模式

于 2008-09-17T15:26:31.580 回答
1

实际上,由于“根”节点是节点的一个特例,也许你需要 RootHtmlPageNode : HtmlPageNode。

另一个想法:由于您没有指定“根”节点和普通节点之间的区别,因此可能只是节点中的一个标志指定它是否是根节点也是一个好的设计。

编辑:根据您的说明,普通节点和根节点之间没有功能差异,因此一个简单的标志就足够了(或属性 IsRootNode)。如果“根”节点仅提供样式数据(或任何其他自身及其子节点的数据),那么您可以将此样式数据放在单独的结构/类中并递归获取它(基于 IsRootNode):

class Node
{
   private bool isRootNode;
   public bool IsRootNode;

   private StylingData stylingData;
   public StylingData StylingData
   {
      set
      {
         if (this.IsRootNode)
            this.stylingData = value;
         else
            throw new ApplicationException("The node is not root.");
      }
      get
      {
         if (this.IsRootNode)
            return this.stylingData;
         else
            return this.parent.StylingData;
      }
   }
}

这假设每个节点都有对其父节点的引用。

它变得超出了问题,因为我不知道确切的设计。

于 2008-09-17T15:16:18.377 回答
1

我希望 HtmlPageNode 和 CodePageNode 类从 PageNode 或从 RootPageNode 继承。那可能吗?

是的,这是可能的。您需要让 HtmlPageNode 和 codePageNode 有一个对象,该对象将是 PageNode 将继承的 Abstract 类和 RootPageNode 也是。在 HtmlPageNode 和 codePageNode 的构造函数中,您接受新的抽象类,在您的情况下为 PageNode 或 RootPageNode。这样,您就有了 2 个不同的类,它们具有相同的方法但有两个不同的对象。希望对您有所帮助!

于 2008-09-17T15:31:37.263 回答
1

澄清:有多个根节点,根可能有父节点。每个都是唯一具有不同样式的子树的根。想想不同的、颜色编码的部门。(也许 root 是一个糟糕的名称选择。建议?)

Root 是一个糟糕的名称选择,因为它(有点讽刺地)被明确地接受为树结构的顶层,因为树从根从地里出来的地方开始。除此之外的任何节点都是分支或叶子,并且不直接连接到根。

更好的名称应该是 IsAuthoritativeStyleNode、IsCascadingStyleNode、IsStyleParentNode 或限定它:例如 IsDepartmentRootNode。给事物起清晰明确的名称是极大地提高可读性/易于理解的事情之一。

你不能仅仅通过抽象基类/继承来真正实现你想要的。根据其他建议,请考虑使用接口。

我还会考虑考虑是否让数据库模式过多地驱动客户端类设计。并不是说在这种情况下需要改变,但至少应该考虑一下。考虑如何将属性分解到引用公共“节点”表的单独表中,并将它们标准化以最小化空值和/或重复的相同数据。

于 2008-09-17T17:18:08.287 回答
0

PageNode 类是否应该只具有 Root 类型的属性?

替代文字

这是否与 PageNode根的想法相反。或者,它们不是“is-a Root”,因为它们中只有一些是根吗?

这是否意味着该属性可能会遍历树来寻找根祖先?还是只有我一个人?

于 2008-09-17T15:55:43.897 回答