假设您有大约 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 来完成,然后在所有必须戳任何可戳对象的代码中执行以下操作?
public void process(BaseClass b) {
if (b instanceof Pokeable) {
((Pokeable)b).poke();
}
}
或者整个层次结构是否应该为了少数真正 Pokeable 的人而实现 Pokeable?
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()”取决于某物是否想要戳以及对象是否接受被戳。我可以使用访客模式,但这似乎使它更复杂。