我正在研究基于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访客模式以解决滥用行为的问题,但我似乎无法弄清楚如何将其应用于此问题。关于如何做到这一点的想法,或其他方法来解决问题?
谢谢! 史蒂夫
答案 0 :(得分:2)
我玩过,无法弄清楚你如何制作访客模式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);
}
}
}
P.S。在循环中为|=
分配值时,您的意思是使用State
吗?