我有一个程序请求网页,解析它并依赖于结果决定下一步该做什么。
例如:程序应该从页面获取一些元素,我们称之为“目标元素”。如果程序确实请求并获得“someOtherElement”,它将继续执行。如果它获得“aimElement”,Executor应该点击一些链接,执行结束,我们转到下一个任务。程序有20次尝试获取“aimElement”。并且“aimElement”可能在未来发生变化。
看起来很简单,但我真的不知道如何通过良好的oo-design实现这一点。我在想两个对象:Task和Executor。任务包含所有条件,Executor接收Task作为参数,并根据Task的需要执行请求。但是如果执行者将原始页面返回到任务本身,任务将变得复杂,并且它们之间将存在强大的连接。如果Executor返回已经解析过的页面元素,那么Executor将需要知道解析什么以及如何解析,并且也会很复杂,并且会有很强的连接。
我不知道我的解释是否清楚,但也许你可以向我建议一些设计模式,或者只是分享你遇到类似问题的经验。
答案 0 :(得分:2)
我只是使用推送解析器并允许任务为自己感兴趣的任何事件注册自己。基本上,您的解析器会解析文档一次,并通知所有订阅者他们感兴趣的事情类型(例如“img with URL” X“或”链接到Y“)。
然后,您可以查询订阅者以查看下一步(在每个事件结束时/之后),或者让他们自己通过听众方法通知您。
最好的部分是,我确信已经有一个用于Java的HTML推送解析器,所以你可以避免一些工作。