2017-09-29 24 views
0

我正在为研究目的设计html解析器。我在哪里首先创建一个整体设计。我需要在我的设计中访问者模式

存储html元素的数据结构。

Base:HtmlBaseElement

Derived:HTML元素,P成分,HtagElemement,ImgElement,BodyElement,StrongElement

在HTML每种类型的元素的基本上我将创建派生的类。

我需要将这个html文件写回到一个文件并允许用户在已解析的html文件中添加元素。

这是我想到的是:

第一种方法:

  1. 创建由具有每种类型元素的访问功能的BaseVisitor

  2. 创建派生访问者类WriteHtmlVisitor来编写整个文件,其中每个元素visit在HTML数据结构中。

第二种方法:

我还可以使用一类WriteHtmlFile,具有HTMLElement对象,然后写该使用吸气所有元件。

这是写入html文件并在文件中添加新元素的最佳方法。

我只是在寻找建议,因为这是在设计阶段。

谢谢。

回答

0

这里包括四种模式:

  1. 基类具有所有重要的领域进行打印(你的第二个方法)
  2. 虚拟FN通话,并通过基类PTR
  3. 动态访问者模式,为你写
  4. 静态访问者模式

    1. 会引起sw建筑师中的温和的反感,然而在实践中它可能正常工作并且非常快。这里的问题将是,你将始终拥有一个新的派生类,其中包含需要新数据的新派生原理图(或对现有数据的不同处理),因此您的基类将不断变化,并且很快您将重新实现动态分派使用switch语句。在专业方面,它是最快的,如果你有正确的基础数据结构,它将会工作很长时间。一个经验法则是,如果你可以(不一定会)从派生的ctor到base ctor传递所有的print()输入,你就可以。这里有效,因为你只需填写属性和内容(我想)。

    2. 只要你有很少的方法与班级非常接近,速度就会很慢并且很好。它可能在这里工作来添加一个纯虚拟打印()来基础和实现派生类;然而,当你编写第147个虚拟代码时,你的代码就变成了意大利面。 虚拟机的另一个问题是它是一个开放式的层次结构,可能会导致您的lib的客户端实现后代。一旦他们开始这样做,你的设计就会变得不那么灵活了。

    3. 就是你写的。它比虚拟速度慢一些,但在大多数情况下仍然可以接受。对于许多初级编码人员来说,理解幕后的内容是一个障碍。此外,你必须签署一个特定的签名(这不是问题)。否则很容易添加新的实现,并且不会为基类引入新的依赖关系。如果您有许多类似打印的操作(访问者),这将起作用。如果你只有这个,那么这个任务可能有点复杂,但请记住,哪里有一个,会有更多。如果添加新的后代,这是一个封闭的层次结构,访问者被“订阅”(编译时错误),这有时很有用。

    4. 基本上是3 w/o虚拟,所以它很快。你要么通过变体,要么通过具体的类。 (3)中列出的所有设计考虑都适用于这一点,除了制作小辈/中间人更加困难。编码者理解它(模板焦虑),并且与(2) - (4)相比,它非常快。

在一天结束的时候,把它归结为:

  • 你想打开或关闭层次
  • 初级/高级比率CORP。文化(或其中包括读者)
  • 有多快它必须是
  • 多少动作/签名你想象

没有单一的答案(一个尺寸不适合所有),但在思考以上问题帮你决定。

0

我会建议如下:

- Visitor模式 -在这种情况下,虽然你可以应用它,这种模式的基本目的是要拿出行动,因为这模式,这不是一部分这里的情况。你只关心写操作(不同的实现),但这里似乎并不是动态操作的情况。

- 策略模式 -您可以利用策略模式代替,最初,你可以用SimpleDiskStorageStrategy开始,为您设计的发展,你可以在未来的多种策略,例如CachingStorageStrategyDatabaseStorageStrategy。由于您的需求是遍历和动态处理结构中的元素(添加/删除元素),我认为这是一个结构性问题而不是行为。因此,尝试使用复合&构建模式(如果复杂性增加)。

- 享元模式 -用它来创建和维护所有html对象的引用(您可以为每个HTML文档类型传递State对象)。这将有助于在解析许多HTML文档时更好地进行内存管理,并有效地改善磁盘上的存储。