我需要在我的设计中访问者模式
我正在为研究目的设计html解析器。我在哪里首先创建一个整体设计。我需要在我的设计中访问者模式
存储html元素的数据结构。
Base
:HtmlBaseElement
Derived
:HTML元素,P成分,HtagElemement,ImgElement,BodyElement,StrongElement
在HTML每种类型的元素的基本上我将创建派生的类。
我需要将这个html文件写回到一个文件并允许用户在已解析的html文件中添加元素。
这是我想到的是:
第一种方法:
创建由具有每种类型元素的访问功能的
BaseVisitor
。创建派生访问者类
WriteHtmlVisitor
来编写整个文件,其中每个元素visit
在HTML数据结构中。
第二种方法:
我还可以使用一类WriteHtmlFile
,具有HTMLElement
对象,然后写该使用吸气所有元件。
这是写入html文件并在文件中添加新元素的最佳方法。
我只是在寻找建议,因为这是在设计阶段。
谢谢。
这里包括四种模式:
- 基类具有所有重要的领域进行打印(你的第二个方法)
- 虚拟FN通话,并通过基类PTR
- 动态访问者模式,为你写
-
静态访问者模式
会引起sw建筑师中的温和的反感,然而在实践中它可能正常工作并且非常快。这里的问题将是,你将始终拥有一个新的派生类,其中包含需要新数据的新派生原理图(或对现有数据的不同处理),因此您的基类将不断变化,并且很快您将重新实现动态分派使用switch语句。在专业方面,它是最快的,如果你有正确的基础数据结构,它将会工作很长时间。一个经验法则是,如果你可以(不一定会)从派生的ctor到base ctor传递所有的print()输入,你就可以。这里有效,因为你只需填写属性和内容(我想)。
只要你有很少的方法与班级非常接近,速度就会很慢并且很好。它可能在这里工作来添加一个纯虚拟打印()来基础和实现派生类;然而,当你编写第147个虚拟代码时,你的代码就变成了意大利面。 虚拟机的另一个问题是它是一个开放式的层次结构,可能会导致您的lib的客户端实现后代。一旦他们开始这样做,你的设计就会变得不那么灵活了。
就是你写的。它比虚拟速度慢一些,但在大多数情况下仍然可以接受。对于许多初级编码人员来说,理解幕后的内容是一个障碍。此外,你必须签署一个特定的签名(这不是问题)。否则很容易添加新的实现,并且不会为基类引入新的依赖关系。如果您有许多类似打印的操作(访问者),这将起作用。如果你只有这个,那么这个任务可能有点复杂,但请记住,哪里有一个,会有更多。如果添加新的后代,这是一个封闭的层次结构,访问者被“订阅”(编译时错误),这有时很有用。
基本上是3 w/o虚拟,所以它很快。你要么通过变体,要么通过具体的类。 (3)中列出的所有设计考虑都适用于这一点,除了制作小辈/中间人更加困难。编码者理解它(模板焦虑),并且与(2) - (4)相比,它非常快。
在一天结束的时候,把它归结为:
- 你想打开或关闭层次
- 初级/高级比率CORP。文化(或其中包括读者)
- 有多快它必须是
- 多少动作/签名你想象
没有单一的答案(一个尺寸不适合所有),但在思考以上问题帮你决定。
我会建议如下:
- Visitor模式 -在这种情况下,虽然你可以应用它,这种模式的基本目的是要拿出行动,因为这模式,这不是一部分这里的情况。你只关心写操作(不同的实现),但这里似乎并不是动态操作的情况。
- 策略模式 -您可以利用策略模式代替,最初,你可以用SimpleDiskStorageStrategy
开始,为您设计的发展,你可以在未来的多种策略,例如CachingStorageStrategy
或DatabaseStorageStrategy
。由于您的需求是遍历和动态处理结构中的元素(添加/删除元素),我认为这是一个结构性问题而不是行为。因此,尝试使用复合&构建模式(如果复杂性增加)。
- 享元模式 -用它来创建和维护所有html对象的引用(您可以为每个HTML文档类型传递State对象)。这将有助于在解析许多HTML文档时更好地进行内存管理,并有效地改善磁盘上的存储。