我正在设计一个从HTML页面中提取实体的程序。 我有一个草图设计,但我对它不满意,因为它强烈地将我的算法类与我选择使用的HTML解析器结合起来。 我很高兴听到更好设计的建议。
我的设计如下:
public interface HTMLSearcherInterface
{
void readHTML(URI);
List<SearchResultInterface> searchContent(predicate<String>);
}
public interface SearchResultInterface
{
String getResultText();
Node getResultNode();
}
我有EntityExtractor,它包含HTMLSearcherInterface,并使用它在HTML文件中搜索关键词,并在其周围查找其他详细信息。 这就是我需要搜索结果中的getResultNode的原因。
答案 0 :(得分:0)
在输入这个问题时,我想到了解决方案:
必须将Node返回到算法以搜索它,表明我的HTMLSearcherInterface不够好,因为我与HTML的每次交互都应该由它调解,我不应该发现自己遍历树来搜索它我的算法。
因此将其更改为:
public interface HTMLSearcherInterface
{
void readHTML(URI);
void searchContent(predicate<String>);
void searchInResultSiblings(SearchResultInterface,predicate<String>);
void searchInResultParents(SearchResultInterface, int maxDistance,predicate<String>);
void searchInResultChildren(SearchResultInterface, int maxDistance,predicate<String>);
SearchResultInterface getNextResult();
bool hasNextResult();
}
public interface SearchResultInterface
{
String getResultText();
long id getResultId();
}
解决了与HTML解析库强耦合的问题。 这个解决方案的缺点是使用搜索功能并获得结果不再是线程安全的。
但是如果线程安全很重要,可以使用搜索器的多个实例,如果这是一个非常大的文档(我怀疑存在),可以通过利用工厂模式在搜索者之间共享同一文档。