Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将两个+;外部图书馆_Java_Oop_Design Patterns - Fatal编程技术网

Java 将两个+;外部图书馆

Java 将两个+;外部图书馆,java,oop,design-patterns,Java,Oop,Design Patterns,我正在使用两个第三方库来执行类似的功能。我需要能够决定在运行时使用哪一个库(每一个库在不同类型的任务中都有优势,我只知道在运行时特定任务需要哪一个库) 我试图创建一个类,以便在运行时动态调用特定库的功能。起初,我考虑使用适配器模式,但问题是两个库都返回不同类型的对象,并且适配器模式只有在接口(或签名)相同时才有用 为了提供一个具体的示例,Selenium框架允许我通过调用WebDriver实例上的方法driver.findElement(by.Xpath(“Xpath”))从页面提取web元素。

我正在使用两个第三方库来执行类似的功能。我需要能够决定在运行时使用哪一个库(每一个库在不同类型的任务中都有优势,我只知道在运行时特定任务需要哪一个库)

我试图创建一个类,以便在运行时动态调用特定库的功能。起初,我考虑使用适配器模式,但问题是两个库都返回不同类型的对象,并且适配器模式只有在接口(或签名)相同时才有用

为了提供一个具体的示例,
Selenium
框架允许我通过调用
WebDriver
实例上的方法
driver.findElement(by.Xpath(“Xpath”))
从页面提取web元素。类似地,
XSoup
框架(JSoup的扩展)允许我通过调用
XSoup来执行相同的功能。编译(“XPath”).evaluate(doc.getElements()。这两种方法的功能在语义上是等价的——但是它们都返回(并期望)两种不同类型的对象(
WebDriver
返回
WebElement
XSoup
返回
Element
的实例-两个不同的对象。类似地,
WebDriver
需要
driver
对象,
XSoup
需要
文档
对象作为参数传入)

我的目标是通过调用单个方法(如本例中的
getElement()
)合并两个框架的功能,并让该方法处理调用正确库/框架的细节(例如,基于传递给该方法的某些参数)

什么设计模式可以用于在运行时合并两个库的功能


谢谢

您使用适配器模式是正确的。听起来您需要两个级别的适配器

首先需要定义一个能够包装WebElement和元素的公共接口:

公共接口MyElement{
字符串getText();
}  
公共类SeleniumElement实现MyElement{
私有网络元素;
公共硒元素(WebElement){
this.element=元素;
}
公共字符串getText(){
返回元素。getText();
}
}
公共类XSoupElement实现MyElement{
私人要素;
公共XSoupElement(元素){
this.element=元素;
}
公共字符串getText(){
返回元素text();
}
}
然后,您需要定义一个返回这些值的接口,并为XSoup和您正在使用的任何其他库提供一个实现。这些实现将只包装库中的返回值:

公共接口驱动程序{
公共MyElement findByXpath(字符串xpath);
}
公共类MySeleniumDriver实现驱动程序{
公共MyElement findByXpath(字符串xpath){
返回新的SeleniumElement(driver.findElement(By.Xpath(Xpath));
}
}
公共类MyXSoupDriver实现驱动程序{
公共MyElement findByXpath(字符串xpath){
返回新的XSoupElement(Xsoup.compile(xpath.evaluate(doc.getElement());
}
}
然后在运行时,您可以更改您使用的框架:

Driver myDriver=isSeliniumBetter?新的MySeliniumDriver():MyXSoupDriver();
String text=myDriver.findByXPath(“xpath”).getText();

仅仅将逻辑封装到一个方法中,该方法的签名是访问所需功能的门面,这还不够吗?访问此方法的客户端代码就不需要依赖于这两个库。如果您发布了迄今为止的代码,并澄清了您认为缺少的内容,那么回答问题就更容易了uestion.Thank.如果我只想返回一个“统一”元素(不执行“getText()”方法),我看不出这有什么帮助..除非我遗漏了什么..你是如何组合WebElement和element对象的?你能更好地描述一下“统一”是什么意思吗?您希望如何在代码中使用它?MyElement的要点实际上是将两个库统一到一个公共接口后面,您可以使用该接口在运行时切换实现。如果不提供您自己的公共接口,就无法统一两个不同的接口,类型系统将不允许它。可能会有更好的模式如果你举个例子,那就看你的用途了。