我正在开发一个基于Java的元胞自动机实现(不确定它是否严格属于这一类),其中单个细胞可能具有不同类型,封装了不同的数据和CA规则。可能会有大量类型,我希望能够动态地插入新类型,而不必维护其他代码。
所有细胞类型都是从一个公共基类派生而来。每个细胞的更新(update)方法在模拟的每一帧中仅被调用一次:
public abstract class Cell
{
public abstract void update(Cell[] neighbors);
}
这在 CA 规则只需要有关单元格数据的情况下很好用,例如:
public class CellTypeA extends Cell
{
public int Data = 0;
@Override
public void update(Cell[] neighbors)
{
Data++;
}
}
然而,我有一些模拟规则需要让单元格查询相邻的邻居单元格以获取数据,但仅当它们属于具有该数据的类型时。使用instanceof运算符来实现这一点是很诱人的:
public class CellTypeB extends Cell
{
public boolean State = false;
private void update(Cell[] neighbors)
{
for (Cell c : neighbors)
{
if (c instanceof CellTypeA)
{
State = (((CellTypeA)c).getData() > 10);
}
}
}
}
如果可能的话,我希望避免使用有臭味的 instanceof。我也不能将getData()提升到超类以实现多态性,因为这些单元格的实际数据结构会更加复杂和多样化。我一直在阅读GoF访问者模式,以解决instanceof滥用问题,但似乎无法弄清如何将其应用于此问题。对于如何解决此问题或其他方法的想法如何?
谢谢! 史蒂夫
operate(Cell c)
和operate(CellSubclass s)
,并且你调用operate(x)
,Java 将会选择最匹配的派生类型的方法。 - sje397