涉及交叉铸造的设计模式的名称

时间:2013-12-11 16:58:30

标签: java design-patterns interface casting selenium-webdriver

在使用Selenium WebDriver时,我注意到他们的API中有一个带有类层次结构的模式。

api的设置如下:

Interface A {
   void doAStuff();
}
Interface B {
   void doBStuff();
}
Interface C {
   void doCStuff();
}
Class X implements A, B, C {
   ...
}
Class Y implements A, B, C {
   ...
}
Class Z implements A, B, C {
   ...
}

实现如下:

public void doStuffWithImplementationsOfA(A a) {
   a.doAStuff();
   B b = (B) a;
   b.doBStuff();
   C c = (C) a;
   c.doCStuff();
}

public static void main(String[] args) {
   A a = new X();
   doStuffWithImplementationsOfA(a);
}

正如您所看到的,接口A,B和C根本不会相互扩展,但在API中,A的所有实现也实现了B和C,因此允许交叉转换。具体来说,在Selenium中,WebDriver的所有实现(如FirefoxDriver和ChromeDriver)也实现了其他几个常见的无关接口(HasInputDevices,JavascriptExecutor等);同样,WebElement的所有实现都实现了其他常见的无关接口(如Locatable)。这不仅允许,而且需要在接口之间交叉构建以访问每个实现中的各种方法。

我的问题,分三部分:

  1. 这种层次结构是否有资格作为设计模式?
  2. 如果是,它有名字吗?
  3. 以这种方式设计API有什么好处/缺点(而不是只使C扩展B,B扩展A)?
  4. 编辑:这是WebDriver API层次结构的图表(并非详尽无遗)。

    enter image description here

1 个答案:

答案 0 :(得分:2)

这不是new的东西 - 它是Java中的常见机制。请查看IterableComparableSerializable。许多类将实现其中的一个或多个并且工作正常。

最近,随着泛型的出现,你可以使用这样的东西更有意义并且不需要那么可怕的演员:

interface A {
  void doAStuff();

}

interface B {
  void doBStuff();

}

interface C {
  void doCStuff();

}

public static <T extends A & B & C> void doStuff (T to) {
  to.doAStuff();
  to.doBStuff();
  to.doCStuff();
}
  1. 这种层次结构是否有资格作为设计模式?

    不是我知道的。

  2. 如果有,是否有名字?

    见1.

  3. 以这种方式设计API有什么好处/缺点(而不是只使C扩展B,B扩展A)?

    如果接口不是层次结构,那么没有理由这样做。请参阅上面的IterableComparable