假设您有一个Java类层次结构,大约有30个类,其中包括一个基类BaseClass和两个主要的子类(SubclassA,SubclassB),每个子类都有几个子类。其中一些子类具有某些特定行为。假设您可以“poke”它们,改变它们的状态。(这是对现有层次结构添加行为的新要求。“Poke”对大多数类来说毫无意义。)
这应该通过在仅需要它的类中实现 Pokeable,然后在必须 poke 任何可 poke 对象的所有代码中执行以下操作来完成吗?
编辑添加:这有点像双重分派问题。当“扑克”代码对一个对象进行操作时,如果该对象是“可扑”,则必须调用“poke()”,否则不能调用。是否“poke()”取决于是否有东西想要poke和对象是否接受被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,然后在必须 poke 任何可 poke 对象的所有代码中执行以下操作来完成吗?
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()”取决于是否有东西想要poke和对象是否接受被poke。我可以使用访问者模式,但那似乎会使它更加复杂。
poke()
它们全部。您能澄清什么是poking以及在什么情况下执行它吗? - cheekenprocess(Pokeable obj)
方法以及一个process(BaseClass obj)
方法来变化处理类吗?process(Pokable obj)
可以在很大程度上委托给其他的 process 方法。 - cheeken