我正在研究一种基于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);
}
}
}
}
如果可能的话,我宁愿避开有臭味的例子。我也不能仅仅将getData()提升到超类来实现多态性,因为这些单元格的实际数据结构会更加复杂和多样。我一直在读关于GoF-Visitor模式来解决滥用实例的文章,但我似乎不知道如何将其应用于这个问题。思考如何做到这一点,或者其他解决问题的方法?
谢谢!Steve
我到处玩,不知道如何使访问者模式a)巧妙地处理两个要访问的项目,b)可以根据需要插入。
这是有效的,但可能会将instanceof
隐藏在番石榴的东西中:
import com.google.common.collect.Iterables;
import java.util.Arrays;
public class CellTypeB extends Cell
{
public boolean State = false;
@Override
public void update(Cell[] neighbors) {
Iterable<CellTypeA> onlyAs = Iterables.filter(Arrays.asList(neighbors), CellTypeA.class);
for(CellTypeA a: onlyAs) {
State = (a.getData() > 10);
}
}
}
附言:在循环中为State
赋值时,您的意思是使用|=
吗?