0

好的,这很难解释,在过去的几年里,我一直在努力解决这个问题。我确信一定有某种模式可以以某种方式做到这一点,但遗憾的是我没有意识到这一点。

有一个外国库的基类和几个子类(今天它是关于硒的)我想在基类中引入一些帮助方法(使用已经存在的方法),然后这些方法也可以在扩展的外国子类中使用这节课。

一个具体的例子:

WebDriverSelenium 类提供了一种findElement在 DOM 中查找元素的方法。最后,必须使用所有子类的特定WebDrivereg(ChromeDriver或) 。FirefoxDriverWebDriver

话虽如此,我想扩展WebDriver一些方便的方法,然后可以与所有子类驱动程序一起使用。例如,我想注入一个findElementTimeout或多或少包含类似内容的方法:

manage().timeouts().implicitlyWait(milliseconds, TimeUnit.MILLISECONDS); WebElement element = findElement(selector); manage().timeouts().implicitlyWait(0 , TimeUnit.MILLISECONDS); return element;

事实上,它根本不是关于 Selenium 的,而是一个非常普遍的用例。使用已经给出的方法更改外国软件的父类。谁能指出在这种情况下使用的一般解决方案?

4

1 回答 1

1

如果不借助字节码检测,您就无法在 Java 中动态修改类。在这种情况下使用的通用软件工程解决方案是装饰器模式。

您可以创建一个无状态包装类,它将基类作为单个构造函数参数,例如:

 public class WebDriverDecorator {
      public final WebDriver webDriver;

      public WebDriverDecorator(WebDriver wd) {
          this.webDriver = wd;
      } 

      // add your conveniece methods here
 }

然后,在子类或其他任何地方,如果你有一个 WebDriver 的实例,你可以用 WebDriverDecorator 装饰它并调用你的便利方法:

WebDriver wd = ....;
WebDriverDecorator wdd = new WebDriverDecorator(wd);
wdd.yourMethodCallGoesHere();
于 2013-09-20T10:15:39.250 回答