Sto sviluppando una semplice applicazione che esegue la scansione nelle pagine Web per ottenere alcune informazioni. Per questo ho usato e testato alcune librerie, come crawler4j, jsoup, jaunt e htmlunit. Ho scambiato più volte un'API con un'altra perché a volte ho percepito che mi è servito meglio in determinate funzioni rispetto a quello che stavo usando. Potrei doverlo fare altre volte e ogni volta che lo faccio dovrò aggirare il codice facendo vari refactoring.
Quindi decido di separare le chiamate per queste API in una sorta di classi incapsulate che contiene tutte le operazioni che devo fare con questa API.
Esiste un modello di progettazione per mitigare questo problema?
Sotto un semplice esempio che uso il suffisso "Handler":
MODIFICA la versione finale:
public interface CrawlerApiHandler {
String visit (String url);
}
public class JsoupCrawlerApiHandler implements CrawlerApiHandler {
public static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36";
@Override
public String visit(String url) {
try {
return Jsoup.connect(url).timeout(20000)
.userAgent(USER_AGENT).get().toString();
} catch (IOException e) {
//LOG
return "";
}
}
}
public class JauntApiHandlerImpl implements CrawlerApiHandler {
UserAgent userAgent;
public JauntApiHandlerImpl(UserAgent userAgent) {
this.userAgent = userAgent;
}
@Override
public String visit(String url) {
try {
return userAgent.visit(url).toString();
} catch (ResponseException e) {
return "";
}
}
}