我创建了一个实用程序类,该类具有一些方法来检查网页上的元素。现在是时候重构这些方法,使它们属于自己的类了,以便我可以将它们传递出去。
该类中的方法的几个存根在下面,但还有更多的存根带有不同的参数:
public boolean checkElementExistsByText(String key, String text) {}
public boolean checkElementText(String key, Predicate<String> predicate) {}
public boolean checkElementText(WebElement element, Predicate<String> predicate){}
我尝试创建以下界面:
interface CheckElementInterface {
boolean checkElement();
}
我对此有问题,因为我无法在checkElement方法中处理多个参数,因此必须将它们传递给实现此功能的每个类的构造函数;
public class CheckedElementExistsByText implements CheckElementInterface{
private final WebElement element;
private final String text;
public CheckedElementExistsByText(WebElement element, String text) {
this.element = element;
this.text = text;
}
@Override
public boolean checkElement() {
}
这是最好的方法吗,还是我可以将多个参数传递给checkElement()方法?
谢谢
答案 0 :(得分:0)
您可以创建参数化界面:
interface CheckElementInterface<T1, T2> {
boolean checkElement(T1 elem1, T2 elem2);
}
然后您可以创建实现,例如:
public class CheckedElementExistsByText implements CheckElementInterface<WebElement, String>{
@Override
public boolean checkElement(WebElement element, String text) {
}
已编辑:
采用参数化接口的方法提出了一个问题,即如何为具体的T1,T2获得接口的实现。它需要实现中的其他功能,有助于分派“ checkElement”请求。例如
interface CheckElementInterfaceProvider {
CheckElementInterface<T1, T2> getChecker(T1, T2);
}
和示例用法:
WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement(element, text);
正如我现在看到的那样:由于CheckElementProvider可以充当工厂,因此在checkElementMethod中不需要参数。
WebElement element;
String text;
checkElementInterfaceProvider.get(element, text).checkElement();
并修改了CheckElementInterface(现在几乎与示例中的相同-仅添加了类型参数):
interface CheckElementInterface<T1, T2> {
boolean checkElement();
}
public abstract class AbstractCheckElement<T1, T2> implements CheckElementInterface<T1, T2>{
private final T1 e1;
private final T2 e2;
public AbstractCheckElement(T1 e1, T2 e2) {
this.e1 = e1;
this.e2 = e2;
}
}
public class CheckedElementExistsByText implements AbstractCheckElement<WebElement, String>{
public AbstractCheckElement(WebElement element, String text) {
super(element, text);
}
@Override
public boolean checkElement() {
}
}