Java接口/抽象类之间的关系

时间:2015-10-25 19:18:36

标签: java algorithm design-patterns interface

我正在尝试构建一个根据遍历策略更新策略以不同方式工作的算法。但是,并非每个更新策略都适用于每个遍历策略。因此,我认为更新策略只能用相应的遍历策略进行实例化。我想为此强制构造函数(见下文)。因此,子类必须检查它们是否支持该策略。

我目前正在使用界面

public interface TraversalStrategy {
...
}

一个(无效的)抽象类

public abstract class UpdateStrategy {
protected TraversalStrategy travStrategy;

public abstract UpdateStrategy(TraversalStrategy travStrategy);
}

暗示这种依赖的正确方法是什么?我当然可以为这个构造函数添加一个空体,但这对我来说似乎不对。

更新 在@Kayaman的答案的启发下,我创建了一个新类TestcaseGenerator,用于构建有效的组合。

public TestcaseGenerator(TraversalStrategy travStrategy, UpdateStrategy updStrategy){
    if (updStrategy.supports(travStrategy)){
        this.travStrategy = travStrategy;
        this.updStrategy = updStrategy;
    }
}

Current Class Diagram

我对此不感兴趣的是,现在没有必要将TraversalStrategy的实例提供给UpdateStrategy以检查它是否受支持。我宁愿只需要类名。你能告诉我如何实现这个目标吗? .getClass().getName()的实验似乎很糟糕。目前我在做:

public boolean supports(TraversalStrategy travStrategy){
   if(travStrategy instanceof UpstreamTraversalStrategy){ 
       return true; 
   }
   return false;
}

2 个答案:

答案 0 :(得分:1)

一种常见的方法是让超类构造函数调用一个抽象方法,例如isSupported(TraversalStrategy t);,如果它不成立,则会失败。

然后,子类将使用instanceof或任何其他方式相应地实现该方法,以确定策略是否受支持。

一种方法是使用Builder模式方法创建第三个类。不是将TraversalStrategy作为参数提供给UpdateStrategy,而是将它们都包含在第三个对象中(并且可以在build()处检查它们以防止不兼容的策略)。

然后,您可以在第三个类中拥有一般功能,战略类变得更轻。

答案 1 :(得分:1)

即使是抽象类也必须具有有效的构造函数。即使通过它不可能创建抽象类的实例,非抽象子类总是首先调用超类的构造函数。因此,抽象类上的构造函数需要一个主体来初始化TraversalStrategy