假设您有一个大约30个类的Java类层次结构,其中有一个基类BaseClass和两个主要子类(SubclassA,SubclassB),每个子类都有几个子类。这些子类中的一些具有一定的行为。假设您可以“戳”它们,更改它们的状态。 (这是向现有层次结构添加行为的新要求。“Poke”对大多数类没有意义。)

interface Pokeable {
  void poke();
  int getTimesPoked();
}


public class Pokey extends SubclassB
implements Pokeable {
  private int timesPoked = 0;
  public void poke() {
    timesPoked++;
  }
  public int getTimesPoked() {
    return timesPoked;
  }
}

是否应该通过仅在需要Pokeable的类中实现Pokeable,然后在必须戳破任何可戳破对象的所有代码中执行以下操作来做到这一点?
public void process(BaseClass b) {
  if (b instanceof Pokeable) {
    ((Pokeable)b).poke();
  }
}

还是为了少数几个真正可实现的功能,整个层次结构应该实现可实现的功能?
interface Pokeable {
  void poke();
  int getTimesPoked();
  boolean isReallyPokeable();
}

public class BaseClass implements Pokeable {
  public void poke() {}
  public int getTimesPoked() { return 0; }
  public boolean isReallyPokeable() { return false;}
}

public class Pokey {
  private int timesPoked = 0;
  @Override
  public void poke() {
    timesPoked++;
  }
  @Override
  public int getTimesPoked() {
    return timesPoked;
  }
  @Override
  public boolean isReallyPokeable() {
    return true;
  }
}

public void process(BaseClass b) {
  b.poke();
}

编辑添加:这是一个双重调度问题。在“扑克”代码对对象执行某项操作的情况下,如果对象是“可戳的”,则必须调用“poke()”,否则不能调用。是否“poke()”取决于是否要戳戳以及对象是否接受戳戳。我可以使用Visitor模式,但这似乎使其变得更加复杂。

最佳答案

如果一个类不是可定位的,我建议不要实现Pokeable接口,因为那会造成混淆。

而是采用以下方法之一。

  • 创建实现BaseClassPokable的抽象或具体子类,并让您所有的to-Pokeable子类对其进行扩展。如果通过所有实现类中的相同逻辑实现poke()ing,则此方法效果很好。
  • 让每个子类分别实现Pokeable
  • 08-17 04:05