gpt4 book ai didi

java - 实现迭代回退机制的设计模式

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:53 25 4
gpt4 key购买 nike

我写了一个词定义 getter ,它从字典网站解析网页。并非所有网页都具有完全相同的 HTML 结构,因此我必须实现多种解析方法来支持大多数情况。

下面是我到目前为止所做的,这是非常难看的代码。

你认为编写某种迭代回退机制的最简洁的方法是什么(可能有更合适的术语),这样我就可以实现 N 个有序的解析方法(解析失败必须触发下一个解析方法,而 IOException 等异常应该中断该过程)?

    public String[] getDefinition(String word) {
String[] returnValue = { "", "" };
returnValue[0] = word;
Document doc = null;
try {
String finalUrl = String.format(_baseUrl, word);
Connection con = Jsoup.connect(finalUrl).userAgent("Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17");
doc = con.get();
// *** Case 1 (parsing method that works for 80% of the words) ***
String basicFormOfWord = doc.select("DIV.luna-Ent H2.me").first().text().replace("·", "");
String firstPartOfSpeech = doc.select("DIV.luna-Ent SPAN.pg").first().text();
String firstDef = doc.select("DIV.luna-Ent DIV.luna-Ent").first().text();

returnValue[1] = "<b>" + firstPartOfSpeech + "</b><br/>" + firstDef;
returnValue[0] = basicFormOfWord;
} catch (NullPointerException e) {
try {
// *** Case 2 (Alternate parsing method - for poorer results) ***
String basicFormOfWord = doc.select("DIV.results_content p").first().text().replace("·", "");
String firstDef = doc.select("DIV.results_content").first().text().replace(basicFormOfWord, "");

returnValue[1] = firstDef;
returnValue[0] = basicFormOfWord;
} catch (Exception e2) {
e2.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return returnValue;
}

最佳答案

听起来像 Chain-of-Responsibility - 像图案。我会有以下内容:

public interface UrlParser(){
public Optional<String[]> getDefinition(String word) throws IOException;
}

public class Chain{
private List<UrlParser> list;

@Nullable
public String[] getDefinition(String word) throws IOException{
for (UrlParser parser : list){
Optional<String[]> result = parser.getDefinition(word);
if (result.isPresent()){
return result.get();
}
}
return null;
}
}

我在这里使用 Guava 的 Optional,但您也可以从界面返回一个 @Nullable。然后为每个你需要的URL解析器定义一个类,并将它们注入(inject)到Chain

关于java - 实现迭代回退机制的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9870490/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com