我正在研究一个基于 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() 提升到超类以实现多态性,因为这些单元的实际数据结构会更加复杂和多样。我一直在阅读有关解决 instanceof 滥用的 GoF 访问者模式,但我似乎无法弄清楚如何将其应用于此问题。关于如何做到这一点或其他解决问题的方法的想法?
谢谢!史蒂夫